前端算法——回文字符串一(失败的两次尝试)

  • 最大回文子串是被研究得比较多的一个经典问题。最近月神想到了一个变种,对于一个字符串,如果不要求子串连续,那么一个字符串的最大回文子串的最大长度是多少呢。
  • 注意:子串虽然不要求连续,但是相对位置不能改变!第一次尝试失败的原因
			// var arr='abcbbbbbbbaaaaabakdflsfjdssfhdksafldhsfkdashlfh123213123213akldfjsldfjsa123123A'.split('');
			// var len=arr.length;
			// var myarr={};
			// for(var i=0;i<len;i++){
			//     if(myarr[arr[i]]){
			//         myarr[arr[i]]+=1;
			//     }else{
			//         myarr[arr[i]]=1;
			//     }
			// }
			// console.log(myarr)
			// // 记录是否存在长度==1的字符
			// var flag=false;
			// // 再设置一个标记来判断,存在完全重复的字符 aaa
			// var comFlag=false;
			// var max=0;
			// for(var item in myarr){
			//     if(myarr[item]>1){
			// 		if(myarr[item]%2==1){
			// 			comFlag=true;
			// 		}
			//         max+=(Math.floor(myarr[item]/2)*2);
			//     }else if(myarr[item]==1&&!flag){
			//         flag=true;
			//     }
			// }
			// if(flag||comFlag){
			//     max++;
			// }
			// console.log(max)
  • 第一次只通过80%,其实根源上就是错误了,因为子串的相对位置不可改变,不能单纯算数目

  • 第二次尝试遍历每个元素及空格,以其为中心点进行回文判断,相等则+1,大于max则改变max,但是依旧只通过93%,不明白。。

			var arr='aaaaabbbbaaacccddefdasfdsafdsafdshfkdslfhdlsakhfieosoafhiwolasfhioelsahfioelshfoialewjafdhisoafhiehaflsdhifhealsdhfieohalfdhsaiofhealskhdfiehighalfdjasioehiohfeioafhsdf'.split('');
			var len=arr.length;
			var max=0;
			for(var i=0;i<len;i++){
				// 中心点分别为空格/元素时
				// 注意,一定是左边元素小于右边元素,函数针对的是该种情况,所以需要变动下
				if(i<=(len/2)){
					getmax(arr.slice(0,i),arr.slice(i))
					getmax(arr.slice(0,i),arr.slice(i+1),true)
				}else{
					getmax(arr.slice(i).reverse(),arr.slice(0,i).reverse())
					getmax(arr.slice(i+1).reverse(),arr.slice(0,i).reverse(),true)
				}
			}
			
			function getmax(left,right,flag){
				// console.log(left,right,flag)
				var mymax=0;
				// 选中元素为中心点时+1
				if(flag){
					mymax++;
				}
				var leftLen=left.length;
				var rightIndex=0
				for(var i=leftLen-1;i>=0;i--){
				    for(var j=rightIndex;j<right.length;j++){
				        if(left[i]==right[j]){
				            mymax+=2;
				            // 右边元素开始遍历的起点为当前索引+1
				            rightIndex=j+1;
				            break;
				        }
				    }
				}
				// 替换max
				if(mymax>max){
					max=mymax;
				}
			}
			console.log(max)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值