5. 最长回文子串

动态规划:

  • 状态定义:dp[i][j]表示从ij的子串是否为回文串,truefalse不是,边判断边检查最大长度并保留子串的起始坐标和长度。
  • 状态转移:如果s[i]==s[j]并且dp[i+1][j-1]=true,则dp[i][j]=true
  • 状态初始化:dp[i][i]=true,每个字符本身是一个回文串;如果s[i-1]=s[i],则dp[i-1][i]=true。后续检查从长度为3开始。
class Solution {  
    public String longestPalindrome(String s) {  
        int len = s.length();  
        if (len < 2) return s;  
        int maxLen = 1;  
        int bg = 0;  
        boolean[][] dp = new boolean[len][len];  
        dp[0][0] = true;  
        for (int i = 1; i < len; ++i) {  
            dp[i][i] = true;  
            if (s.charAt(i) == s.charAt(i - 1)) {
                dp[i - 1][i] = true;
                bg = i - 1;
                maxLen = 2;
            }
        }  
        for (int L = 3; L <= len; ++L) {  
            for (int i = 0; i <= len - L; ++i) {  
                int j = i + L - 1;  
                if (s.charAt(i) == s.charAt(j)) {  
                    dp[i][j] = dp[i + 1][j - 1];  
                    if (dp[i][j] && L > maxLen) {  
                        maxLen = L;  
                        bg = i;  
                    }  
                }  
            }  
        }  
        return s.substring(bg, bg + maxLen);  
    }  
}  

你可能感兴趣的:(LeetCode,动态规划,算法,数据结构)