力扣刷题5.最长回文子串

178 阅读1分钟

5. 最长回文子串

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

示例 1:

输入: "babad"
输出: "bab"

注意: "aba" 也是一个有效答案。 示例 2:

输入: "cbbd"
输出: "bb"

解答:

问题解读,找出字符串中最长的回文子串。回文子串就是对称的字符串。

动态规划:(分割小问题,连续执行。找到最优解)

  • 创建一个二维数组,默认状态为false;
  • 碰到回文就存起状态true;
  • 根据前面短的回文判断后面是否还有回文;
  • 存起最长的字符串。
var longestPalindrome = function(s) { 
	let dp = Array.from({length: s.length}, () => new Array(s.length).fill(false));
  let res = "";
  for(let i=0; i<s.length; i++) {
    //从遍历过的字符串往前找
    for(let j=i; j>=0; j--) {
      //s[i]===s[j]的前提下,i-j<2判断是否是连续的两个字符串
      //判断前面小范围是否是回文,推断后面是否能够回文
      dp[j][i] = s[i]===s[j] && (i-j<2 || dp[j+1][i-1]); 
      if(dp[j][i] && i-j+1 > res.length) {
        res = s.substring(j, i+1);
      }
    }
  }
	return res;
}