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

    示例 1: 输入: “babad” 输出: “bab” 注意: “aba” 也是一个有效答案。

    示例 2: 输入: “cbbd” 输出: “bb”

    命题关键字:字符串、动态规划
    **

    1. /**
    2. * @param {string} s
    3. * @return {string}
    4. */
    5. const longestPalindrome = function(s) {
    6. const dp = [];
    7. // 缓存字符串长度
    8. const len = s.length
    9. // 初始化状态二维数组
    10. for (let i = 0; i < len; i ++) {
    11. dp[i] = [];
    12. };
    13. // 初始化最长回文子串的两个端点值
    14. let st = 0, end=0
    15. // 初始化最长回文子串的初始值为1
    16. for(let i=0;i<len;i++) {
    17. dp[i][i] = 1
    18. }
    19. // 这里为了降低题目的复杂度,我们预先对悬念比较小的 s[i][i+1] 也做了处理
    20. for(let i=0;i<len-1;i++){
    21. if(s[i]===s[i+1]) {
    22. dp[i][i+1] = 1
    23. st = i
    24. end = i+1
    25. }
    26. }
    27. // n 代表子串的长度,从3开始递增
    28. for(let n=3;n<=len;n++) {
    29. // 下面的两层循环,用来实现状态转移方程
    30. for(let i=0;i<=len-n;i++) {
    31. let j = i+n-1
    32. if(dp[i+1][j-1]) {
    33. if(s[i]===s[j]){
    34. // 若定位到更长的回文子串,则更新目标子串端点的索引值
    35. dp[i][j] = 1
    36. st = i
    37. end = j
    38. }
    39. }
    40. }
    41. }
    42. // 最后依据端点值把子串截取出来即可
    43. return s.substring(st,end+1);
    44. }