LeetCode—Longest Palindromic Substring —javascript实现

最长回文子串

题目链接:Longest Palindromic Substring

题目大意:给定一个字符串s,找出在 s中的最长回文子串。 假设字符串s长度最长1000。
举个栗子:
输入: "babad"
输出: "bab"
注: "aba" 也是正确答案

解题思路(leetCode网站上的动态规划思想):
LeetCode—Longest Palindromic Substring —javascript实现_第1张图片

【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);
};

你可能感兴趣的:(LeetCode,刷题)