判断两个字符串是否有公共字符暴力做法需要O(n^2),而通过位运算优化,可以节省不少时间复杂度。
以小写26字母为例,判断两个字符串是否存在公共字符。
使用位运算,创建一个长度为2的数组,每个位置的长度为26,前缀补0,如果当前字符串某个字母存在,则该字母的位置上为1.比较两个字符串所创建的数组,做与运算,结果为1则存在相同字符,否则不存在。
最大单词长度乘积
class Solution {public int maxProduct(String[] words) {long maxv = 0;int marks[] = new int[words.length];for (int i = 0; i < words.length; i++) {String word = words[i];for (int j = 0; j < word.length(); j++) {marks[i] |= 1 << (word.charAt(j) - '0');}}for (int i = 0; i < words.length; i++) {for (int j = i + 1; j < words.length; j++) {if ((marks[i] & marks[j]) == 0) {maxv = Math.max(maxv, words[i].length() * words[j].length());}}}return (int) maxv;}
}