零题:算法(leetode,附思维导图+全解)300题(5)最长答案文本子串1标题说明2解法概览(思维导图)3所有解法1Scheme11)代码://Scheme1滑动窗口法(“时间复杂度高,一般不能通过”)varlongestPalindrome=function(s){//是否为回文串.(subStr=''稍微体现了编程的严谨性)constisValid=(subStr='')=>{constl=subStr.length;让resFlag=true;//Boundary:i0;curMaxLength--){//在curMaxLength下,curStartIndex的有效范围是[0,((l+1)-curMaxLength))for(letcurStartIndex=0;curStartIndex<((l+1)-curMaxLength);curStartIndex++){constsubStr=s.substr(curStartIndex,curMaxLength);//一旦遇到回文串,当前子串一定是我们预期的答案(“一”)//因为我们的curMaxLength在每次遍历中都是递减的if(isValid(subStr)){returnsubStr;}}}//边界:也许l是0,然后直接来这里,需要返回一个空字符串(但是topic1<=s.length<=1000,所以可以省略)return"";}2方案21)code://scheme2dynamicprogramming,(s[i]===s[j]&&dp[i+1][j-1])||(s[i]===s[j]&&((j+1)-i)<3)varlongestPalindrome=function(s){constl=s.length,//1)含义:s[i][j]表示s[i,j]是否为回文串(双闭区间)//初始化1:dp,n*n值初始化为falsedp=newArray(l).fill(false).map(item=>newArray(l).fill(false));//当前最长回文子串的开头下标,最大长度让maxStartIndex=0,//边界:maxLength初始化为1不然会有问题,大家自己想想~maxLength=1;//初始化2:dp对角线上的值都为真for(leti=0;imaxLength,更新maxStartIndex,maxLength值if(((j+1)-i)>maxLength){maxStartInd前=我;最大长度=((j+1)-i);}}else{dp[i][j]=false;}}}//最后根据“我们维护的”maxStartIndex,maxLength得到对应的Substring返回s.substr(maxStartIndex,maxLength);}3方案31)代码://方案3中心扩散法(注意“奇数和evencasesareprocessed")varlongestPalindrome=function(s){//根据传入的子串,左右边界下标,不断“向外”移动,试图得到更长的回文串consthelper=(str,left,right)=>{while(left>=0&&rightmaxLength){maxStartIndex=left;最大长度=(右+1-左);}//注意:将这2条语句放在当前if分支的末尾,而不是最前面!!//继续“向外”移动,试图得到更长的回文左边--;回文串,退出循环!b雷克;}}}constl=s.length;//当前“最长回文串”对应的起始下标和最大长度让maxStartIndex=0,maxLength=0;for(leti=0;iarm_len=newArrayList<整数>();int右=-1,j=-1;for(inti=0;i=i){inti_sym=j*2-i;intmin_arm_len=Math.min(arm_len.get(i_sym),right-i);cur_arm_len=expand(s,i-min_arm_len,i+min_arm_len);}else{cur_arm_len=expand(s,i,i);}arm_len.add(cur_arm_len);如果(i+cur_arm_len>right){j=i;右=i+cur_arm_len;}if(cur_arm_len*2+1>end-start){start=i-cur_arm_len;结束=i+cur_arm_len;}}StringBufferans=newStringBuffer();对于(inti=start;i<=end;++i){if(s.charAt(i)!='#'){ans.append(s.charAt(i));}}返回ans.toString();}publicintexpand(Strings,intleft,intright){while(left>=0&&right