leetcode: Maximum Product of Word Lengths

题目来源于: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),暂时也没想出效率更好的办法,有空去看看别人的解法,学习一个!

转载于:https://www.cnblogs.com/foreverleef/p/5073556.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值