注 题目来源:力扣

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。

解题思路:这个题目是直接拍脑袋想法,就是暴力求解。

思路是这样,首先创建一个函数,判断一个字串是不是回文数,判断方法为,选出字符串的中间位置下标。如果是奇数位自行取整。然后一个for循环比较前后字符。返回判断结果。接下来,在函数整个方法里面两层for循环,选取字符串s的下标,截取字串。 再调用创建的判断函数进行判断。 至于寻找最长的,那就设置一个maxlen变量保存最长传的长度,再设置一个变量保存字串的值。

很不幸,这个三重for循环的方法超时了。

所以应该选取一个更优的方法,(菜鸡想不到),翻看题解,动态规划方法来了。

主要的思路是这样的,设置一个二维数组dp[i][j]存储 i 到 j 的字串是否是回文字串,当然保存的也就是true|flase。其中有一个条件,就是如果dp[i][j]要成为回文字串,那么只需要s[i]==s[j]和dp[i+1][j-1]是回文字串。可能表述的不是很清楚。(引用一个原答案的图https://leetcode-cn.com/problems/longest-palindromic-substring/solution/5-zui-chang-hui-wen-zi-chuan-by-alexer-660/)

最长回文数组python_for循环

假装自己讲清楚了,然后两层for循环有一个坑,就是字串应该由结尾向前遍历,而不是从前向后遍历。举个栗子,如果遍历字符ababd,两层循环从i=0.j=i开始遍历,那么第一次循环aba字串的时候,需要查看b字串是否是回文字串,初始化dp数组的时候当然都是0或者false,你得出的b为false,那么aba字串也就是认定不是回文字串。

相反,如果你结尾开始遍历(i=len-1,j=i),这样的话,结尾字串为aba,你此时b字串的结果已经得出来的b是true。

当然我也只是总结出问题在哪,如何改正。对于这一类问题,如果碰见多了也会进行总结。

下面是代码

/**
 * @param {string} s
 * @return {string}
 */
//可以跑出结果,但是超时
var longestPalindrome = function(s) {
    let ans='',maxlen=0;
    function isPalindrome(str){
        let len=parseInt(str.length/2);
        for(var i=0;i<len;i++){
            if(str[i]!==str[str.length-1-i]){
                return false;
            }
        }
        return true;
    }
    for(let j=0;j<=s.length;j++){
        for(k=j+1;k<=s.length;k++){
            var tmpstr=s.substring(j,k);
            if(isPalindrome(tmpstr)&&(tmpstr.length>maxlen)){
                maxlen=tmpstr.length;
                ans=tmpstr;
            }
        }
    }
    return ans;
};
/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(s) {
let arr='',maxlen=0;
let n=s.length;
//二维数组,以及初始化,感觉写的很高大上
let dp=Array.from(new Array(n),() => new Array(n).fill(0));

for(let i=n-1;i>=0;i--){
    for(let j=i;j<n;j++){
        //这行代码真的是太佩服了(还是我太菜)
        dp[i][j]=s[i]==s[j]&&(j-i<2||dp[i+1][j-1]);
        if(dp[i][j]&&j-i+1>arr.length){
            arr=s.substring(i,j+1);
        }
    }
}
return arr;
};