- 最大回文子串是被研究得比较多的一个经典问题。最近月神想到了一个变种,对于一个字符串,如果不要求子串连续,那么一个字符串的最大回文子串的最大长度是多少呢。
- 注意:
子串虽然不要求连续,但是相对位置不能改变!第一次尝试失败的原因
// 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)