题目来源于:https://leetcode.com/problems/maximum-product-of-word-lengths/
大意是:给定一个字符串数组(可以认为字符都是小写字母),如:
["abcw", "baz", "foo", "bar", "xtfn", "abcdef"]
找出任意两个元素,不包含相同的字符,求满足这个条件的2个字符串长度乘积的最大值,如给出的例子,最大值应该是:
"abcw", "xtfn"
此时结果应该是:4*4=16
首先第一个要解决的问题是如何判断2个字符串不包含相同的字符,这个有很多办法。一般来说,字符数量都是固定的,英文字符也就26个,我可以构造一个数,按位记录某个字符是否存在,如:
定义一个变量,整形,var identify=0;
a存在时候,将最低位标记为1,采用移位操作:1<<('a'-97).(97是a的ascii值),此时,identify = identify | (1<<('a'-97));
其他字符存在时同样这样处理。
首先,针对字符串数组,进行预处理,用一个数组记录下每个元素的identify;
其次,采用2个for循环遍历数组每个元素,当2个数组元素的((identify1 & identify2) ===0)时,计算2个元素的长度乘积,如果大于当前的长度乘积值,更新最大值即可。
代码如下:
var maxProduct = function(words) {
if(typeof words == 'undefined' || words.length === 0){
return 0;
}
var identyArray=[];
for(var arrIndex in words){
var curStr = words[arrIndex];
var curId = 0;
for(var i=0;i<curStr.length;i++){
var leftMoveStep = curStr.charCodeAt(i)-97;
curId = curId | (1<<leftMoveStep);
}
identyArray.push(curId);
}
var maxLength = 0;
var wordsLen = words.length;
for(var i=0;i<wordsLen;i++){
var j=i+1;
for(;j<wordsLen;j++){
if((identyArray[i] & identyArray[j]) === 0){
var curLen = words[i].length * words[j].length;
console.log(words[i],words[j],curLen);
if(curLen > maxLength){
maxLength = curLen;
}
}
}
}
return maxLength;
};
这个算法时间复杂度大概是o(n^2),空间复杂度:o(n),暂时也没想出效率更好的办法,有空去看看别人的解法,学习一个!