# 5 最长回文子串

# 题目链接

# 难度:中等

# 思路:

中心扩展法

#

#

#

#

#

#

#

#

#

#

#

#

#

#

# 代码:

双指针:中心扩展

/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(s) {
  let result = s[0] || "";
  // 遍历整个字符串
  for (let i = 0; i < s.length; i++) {
    // 选择一个中心点 j<=2尝试偶数和奇数两种形式的中心点
    for (let j = 1; j <= 2; j++) {
      // 对称回文或者中心点回文
      let left = i, // 左
        right = i + j; // 右
      // 当左右两遍的字符相同时 向外扩展直到两端不相同
      // 左右的边界
      while (left >= 0 && right < s.length && s[left] === s[right]) {
        left--, right++; // 扩展
      }
      // 找到回文
      let length = right - left - 1; // (right - 1) - (left + 1) + 1
      // 对比 更新回文
      if (length > result.length) {
        result = s.substr(left + 1, length);
      }
    }
  }
  return result;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

动态规划: 中心扩展

/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(s) {
    let n = s.length;
    let res = '';
    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 > res.length){
                res = s.substring(i,j+1);
            }
        }
    }
    return res;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 鼓励我一下:

觉得还不错的话,给我的项目点个star

# 点个Star支持我一下~

最后更新时间: 7/2/2020, 4:27:35 PM