给定一个字符串数组 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 
解释: 不存在这样的两个单词。

 

 

思路:

看题目一眼  题意很明朗 颤颤巍巍的用暴力方法写了一遍 贴一下代码

public int maxProduct(String[] words) {
		int res = 0;
		for (int i = 0; i < words.length; i++) {
			String str1 = words[i];
			for (int j = 0; j < words.length; j++) {
				String str2 = words[j];
				if (str1 != str2 && !hasSameChar(str1, str2)) {
					res = Math.max(res, str1.length() * str2.length());
				}
			}

		}

		return res;
	}

	private boolean hasSameChar(String str1, String str2) {
		char[] arr2 = str2.toCharArray();
		for (int i = 0; i < arr2.length; i++) {
			char c = arr2[i];
			if (str1.contains(c + "")) {
				return true;
			}
		}
		return false;
	}

果然,超时了。。。

 

再想一想其他方法

 

考虑一下使用位运算

把每个字符串数组看成一个26大小的数组,小写字母a-z是26位,“abcd” 的int值为 0000 0000 0000 0000 0000 0000 0000 1111, “wxyz” 的int值为 1111 0000 0000 0000 0000 0000 0000 0000
这样两个进行与(&)  如果得到0则不含相同元素, 如果不为0则有相同元素。 

public int maxProduct(String[] words) {
		int len = words.length;
		if (len <= 1)
			return 0;
		int[] mask = new int[len];
		
		for (int i = 0; i < len; i++) {
			for (int j = 0; j < words[i].length(); j++) {
				mask[i] |= 1 << (words[i].charAt(j) - 'a');
			}
		}
		int res = 0;
		for (int i = 0; i < len; i++) {
			for (int j = i + 1; j < len; j++) {
				if ((mask[i] & mask[j]) == 0) {    //不含相同元素
					res = Math.max(res, words[i].length() * words[j].length());
				}
			}
		}
		return res;
	}