问题描述 给定一个字符串(由小写字母组成)列表,要求找出两个不包含相同字母的字符串的最大长度乘积。题目链接:**点我 **
样例输入输出
输入:[“abcw”,”baz”,”foo”,”bar”,”xtfn”,”abcdef”]
输出:16
解释:两个字符串为 abcw 和 xtfn,长度分别是 4 和 4,结果是 4 * 4 = 16
输入:[“a”,”ab”,”abc”,”d”,”cd”,”bcd”,”abcd”]
输出:4
问题解法 此题主要难点在判断两个字符串是否包含相同的字母,最简单的做法是对字符串的每个字母进行比较,但这样会超时,稍微优化点的做法是用 set 来存储字母,将某个字符串加到另外的字符串 set 里,根据 set 的长度变化来判断是否有相同字符,但是这样也会超时,再优化的做法是把字符串字符按位或运算得到一个数字,然后依次对每个字符串或运算的数字进行与运算,如果结果为 0, 说明两个字符串不包含相同的字母,否则说明两个字符串包含相同的字母。对上述满足要求的字符串的长度进行两两相乘,可以找到最大的结果。代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 class Solution { public int maxProduct (String[] words) { int [] chs = new int [words.length]; for (int i = 0 ; i < words.length; i++) { int num = 0 ; for (char ch : words[i].toCharArray()) { num |= 1 << (ch - 'a' ); } chs[i] = num; } int result = 0 ; for (int i = 0 ; i < chs.length; i++) { for (int j = 0 ; j < chs.length; j++) { if ((chs[i] & chs[j]) == 0 ) { result = Math.max(result, words[i].length() * words[j].length()); } } } return result; } }
参考资料 https://leetcode.cn/problems/maximum-product-of-word-lengths/solution/gong-shui-san-xie-jian-dan-wei-yun-suan-cqtxq/