最长回文子串
题目链接:Longest Palindromic Substring
题目大意:给定一个字符串s,找出在 s中的最长回文子串。 假设字符串s长度最长1000。
举个栗子:
输入: "babad"
输出: "bab"
注: "aba" 也是正确答案
解题思路(leetCode网站上的动态规划思想):
【ans=1——记录最长回文子串长度; mi=0,mj=0——最长回文子串的起始和结束位置索引;】
1. 初始化长度为1的子串
2. 初始化长度为2的子串
3. 判断长度为3——s.length的子串是否为回文串(此处DP)
(Note:2、3步都要更新ans.mi.mj)
/**
* @param {string} s
* @return {string}
*/
function initArr(Len){//数组初始化
let arr=new Array(Len);
for(let i=0;i<Len;i++){
arr[i]=new Array(Len).fill(false,0,Len);
arr[i][i]=true;//初始化长度为1的子串
}
return arr;
}
var longestPalindrome = function(s) {
//init
let Len=s.length;
let arr=initArr(Len);
let ans=1,mi=0,mj=0;
for(let i=0;i<Len-1;i++){ //初始化长度为2的子串
if(s[i]==s[i+1]){arr[i][i+1]=true;ans=2;mi=i;mj=i+1;}
}
//DP
for(let len=3;len<=Len;len++){
for(let i=0;i<Len&&(i+len-1)<Len;i++){
let j = i + len - 1;
if(arr[i+1][j-1]&&(s[i]==s[j])){
arr[i][j]=true;
if(ans<len){
mi=i;
mj=j;
ans=j-i+1;
}
}
}
}
return s.substring(mi,mj+1);
};