Leetcode 5 最长回文子串

给你一个字符串 s ,找到 s 中最长的回文子串。

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"
输出:"bb"

示例 3:

输入:s = "a"
输出:"a"

示例 4:

输入:s = "ac"
输出:"a"

解题思路

使用动态规划,状态转移方程如下:

dp[i][j] = (s[i] == s[j]) && (i - j < 3 || dp[j + 1][i - 1])

如果出现 s[i] == s[j] ,则如果满足 i - j < 3 或者 dp[j + 1][i - 1] 也是回文串,那么从 ji 这个区间的字符串也是回文串。

i - j < 3 对应三种情况,第一种是三个字符,首尾相同,中间不管是什么字符,都是回文串,第二种是两个字符,都相同,显然也是回文串,第三种是只有一个字符,一个字符本身也是回文串

Java 实现:

class Solution {
    public String longestPalindrome(String s) {
        if (s == null || s.length() == 0) return s;
        int len = s.length();
        int start = 0;
        int maxLen = 1;
        boolean[][] dp = new boolean[len][len];
        for (int i=0; i maxLen) {
                            // 记录最大长度和起始下标
                            maxLen = i - j + 1;
                            start = j;
                        }
                    }
                }
            }
        }
        // 返回字符串
        return s.substring(start, start + maxLen);
    }
}

JS 实现:

function longestPalindrome(s) {
    if (s == null || s.length == 0) return s;
    let len = s.length;
    let start = 0;
    let maxLen = 1;
    let dp = gen2DArray(len, len);
    for (let i=0; i maxLen) {
                        maxLen = i - j + 1;
                        start = j;
                    }
                }
            }
        }
    }
    return s.substring(start, start + maxLen)
}

function gen2DArray(a, b) {
    let res = [];
    for (let i=0; i

你可能感兴趣的:(Leetcode 5 最长回文子串)