运用了位运算!!!
对位运算非常不熟悉,还需要针对位运算进行练习。
代码:C++
class Solution {
public:
int maxProduct(vector<string>& words) {
int n=words.size();
vector<int> masks(n);
int res=0;
//构造掩码
for(int i=0;i<n;i++){
int wordLength=words[i].size();
for(int j=0;j<wordLength;j++){
masks[i]|=1<<(words[i][j]-'a');//注意这里构造的关键! 26位的二进制 若对应位置为1则说明这里有对应字母(注意写法)
}
}
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if((masks[i]&masks[j])==0){//表示没有重复字母
res=max(res,int(words[i].size()*words[j].size()));
}
}
}
return res;
}
};
Python:
class Solution:
def maxProduct(self, words: List[str]) -> int:
mask=[0]*len(words)#创立一个大小为len(words)的数组
res=0
for i,s in enumerate(words):#i为索引 s为字符串
for c in s:#遍历每个字符 获得该字符串的掩码
mask[i]|=1<<(ord(c)-ord("a"))
for j,t in enumerate(words[:i]):#获得前i个字符串的(已经生成掩码的字符串)索引(j),字符串(t)
if(mask[i]&mask[j])==0:
res=max(res,len(s)*len(t))
return res
对Python语法的解释:
words=['I','love','you']
enumerate(words)
#获得该words的索引+字母:通常出现在for循环里
list(enumerate(words))->
[(0,'I'),(1,'love'),(2,'you')]
ord('a')->97
获得对应字符的ASCII码
words[:i]
#取words的前i个值
#例子:
words=['I','meet','the','best','of','you']
words[:2]->
['I','meet']