【教3妹学编程-算法题】最大单词长度乘积

【教3妹学编程-算法题】最大单词长度乘积_第1张图片

3妹:哇,今天好冷啊, 不想上班。
2哥:今天气温比昨天低8度,3妹要空厚一点啊。
3妹 : 嗯, 赶紧把我的羽绒服找出来穿上!
2哥:哈哈,那倒还不至于, 不过气温骤降,一定要预防流感~

【教3妹学编程-算法题】最大单词长度乘积_第2张图片
3妹:听说东北已经暴雪了
2哥:是啊,他们还放一假,不用上班。哈哈。
3妹:哼, 为什么上海不放假呢。。 我先躲在被窝里刷刷题再去公司吧~

题目:

给你一个字符串数组 words ,找出并返回 length(words[i]) * length(words[j]) 的最大值,并且这两个单词不含有公共字母。如果不存在这样的两个单词,返回 0 。

示例 1:

输入:words = [“abcw”,“baz”,“foo”,“bar”,“xtfn”,“abcdef”]
输出:16
解释:这两个单词为 “abcw”, “xtfn”。
示例 2:

输入:words = [“a”,“ab”,“abc”,“d”,“cd”,“bcd”,“abcd”]
输出:4
解释:这两个单词为 “ab”, “cd”。
示例 3:

输入:words = [“a”,“aa”,“aaa”,“aaaa”]
输出:0
解释:不存在这样的两个单词。

提示:

2 <= words.length <= 1000
1 <= words[i].length <= 1000
words[i] 仅包含小写字母

思路:

【教3妹学编程-算法题】最大单词长度乘积_第3张图片

根据题意进行模拟,利用每个 words[i] 只有小写字母,且只需要区分两字符是否有字母重复。

我们可以使用一个 int 来代指某个 word[i]:低 26 来代指字母 a-z 是否出现过。

然后对每个「字符对」所对应的两个 int 值执行 & 操作(若两字符无重复字符,则结果为 0),并得出最终答案。

java代码:

class Solution {
    public int maxProduct(String[] words) {
        int length = words.length;
        int[] masks = new int[length];
        for (int i = 0; i < length; i++) {
            String word = words[i];
            int wordLength = word.length();
            for (int j = 0; j < wordLength; j++) {
                masks[i] |= 1 << (word.charAt(j) - 'a');
            }
        }
        int maxProd = 0;
        for (int i = 0; i < length; i++) {
            for (int j = i + 1; j < length; j++) {
                if ((masks[i] & masks[j]) == 0) {
                    maxProd = Math.max(maxProd, words[i].length() * words[j].length());
                }
            }
        }
        return maxProd;
    }
}

你可能感兴趣的:(教3妹学编辑-算法篇,算法,c#,开发语言)