Leetcode-005-最长回文子串

动态规划问题,用数组保存所有子串的回文状态,用 l 表示左游标,r 表示右游标,那么dp[l][r] 中的值即代表 l 到 r 这个长度的子串是否回文。

状态有两种判断条件,一种是 如果 l == r + 1 即子串长度为2, 那么只要这两个字符相等就是回文;

另外一种则是不但要求左端和右端字符相等,还要求嵌套的子串为回文,即要求 dp[l+1][r-1] 必须为 true;

class Solution {
    public String longestPalindrome(String s) {
        int start=0,end=0;
        Boolean[][] dp = new Boolean[s.length()][s.length()];
        if(s.length()<2) return s;
        
        for(int r=0;r<s.length();r++){
            dp[r][r] = true;
            for(int l=0;l<r;l++){
                if(l+1==r){
                    dp[l][r] = (s.charAt(l)==s.charAt(r));
                }
                else{
                    
                    dp[l][r] = (dp[l+1][r-1] && (s.charAt(l)==s.charAt(r)));
                }
                if(dp[l][r] && r-l>end-start){
                    end=r;
                    start=l;
                }
            }
        }

        return s.substring(start, end+1);
    }
}
class Solution:
    def longestPalindrome(self, s: str) -> str:
        
        if len(s) <2:
            return s
        dp = [[False for i in range(len(s))] for j in range(len(s))]
        start = 0
        end = 0

        for r in range(len(s)):
            dp[r][r] = True
            for l in range(r):
                if l+1==r:
                    dp[l][r] = (s[l] == s[r])
                else:
                    dp[l][r] = (dp[l+1][r-1] and (s[l] == s[r]))
                
                if(dp[l][r] and (r-l > end-start)):
                    end = r
                    start = l
        return s[start:end+1]

猜你喜欢

转载自www.cnblogs.com/huangzengrui/p/12342949.html
今日推荐