题目名称
318. Maximum Product of Word Lengths
分析
这个问题首先要判断两个字符串是否包含相同的字符,如果不包含,则计算两个字符串长度的乘积;如果有相同的字符,则乘积为0。返回最大的乘积。
因为字符串中的字符都是小写字母,从a-z总共26个,可以考虑用unsigned int类型的整数表示,unsigned int整数占32位内存,可以用第0位到第25为分别表示字母”a”到”z”,0表示字符串中没有该字母,1表示有。
例如字符串”abcef”,用unsigned int(二进制)表示为:11101100 00000000 00000000 00000000。具体过程如下:
unsigned int letterMap = 0;
string str = "abcef";
//设立一个pos表示无符号整数的第1位是1,其余31位为0
//将pos右移相应位再与letterMap作"与"操作就把相应字母所在的位置为1。
unsigned int pos = 1<<31;
for(int i=0;i<str.size();i++){
letterMap |= pos>>(str[i]-'a');
}
C++代码
class Solution {
public:
int maxProduct(vector<string>& words) {
int n=words.size();
if(n<2) return 0;
vector<unsigned int> bm(n,0);
unsigned int pos = 1<<31;
for(int i=0;i<n;i++) {
for(int j=0;j<words[i].size();j++) {
bm[i] |= pos>>(words[i][j]-'a');
}
}
int res = 0;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if((bm[i] & bm[j]) == 0){
int cur = words[i].size()*words[j].size();
res = max(res,cur);
}
}
}
return res;
}
};
总结
这里主要考察位操作,需要对位操作有比较深的了解。