LeetCode——318. 最大单词长度乘积(Java)

题目描述

题干:
给定一个字符串数组 words,找到 length(word[i]) * length(word[j]) 的最大值
并且这两个单词不含有公共字母,你可以认为每个单词只包含小写字母。
如果不存在这样的两个单词,返回 0。

示例 1:
输入: ["abcw","baz","foo","bar","xtfn","abcdef"]
输出: 16 
解释: 这两个单词为 "abcw", "xtfn"。

示例 2:
输入: ["a","ab","abc","d","cd","bcd","abcd"]
输出: 4 
解释: 这两个单词为 "ab", "cd"。

示例 3:
输入: ["a","aa","aaa","aaaa"]
输出: 0 
解释: 不存在这样的两个单词。

题解思路

返回两个不含重复字母的两个单词的最大乘积,这里无非是注意不重复和最大乘积两个点即可

最大乘积我们只需要记录每个乘积结果取最大即可,而两个不含重复字母的单词这里需要判断

题干中给出了每个单词其中都不含重复并且只包含小写字母,下意识就想到了位运算的方向

往常我们最常用的位运算解题思想就是两个相同的数异或为0,可是这里判断的是单词中所含的字母

所以这里又是一个新的思想,我们用记录每个出现字母的位掩码,如果两个单词不重复则他们相与为0

正确代码

    public int maxProduct(String[] words) {
        int length = words.length;
        int[] marks = 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++) {
                marks[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 ((marks[i] & marks[j]) == 0) {
                    maxProd = Math.max(maxProd, words[i].length() * words[j].length());
                }
            }
        }
        return maxProd;
    }

总结

这里需要说一下位掩码,有一道很经典的老鼠试毒的问题很好的诠释了二进制中该思想的妙用

位掩码的思想可以用在很多实际问题中,比如所权限或者枚举类相关的地方

如果文章存在问题或者有更好的题解,欢迎在评论区斧正和评论,各自努力,最高处见
posted @ 2021-11-17 09:44  21岁还不是架构师  阅读(51)  评论(0编辑  收藏  举报