leetcode5-最长回文子串
- 中心扩展法
从中心向两侧扩展,分为两种情况:一种是奇数长度,一种是偶数长度,需要分开讨论。
class Solution {
    public String longestPalindrome(String s) {
        int n = s.length(), left = 0, right = 0;
        for(int i = 0; i < s.length(); i++){
            int l = i, r = i;
            while(l > 0 && r < n-1 && s.charAt(l-1) == s.charAt(r+1)){
                l--;
                r++;
            }
            if(r-l > right-left){
                right = r;
                left = l;
            }
            l = i; r = i+1;
            if(r == n || s.charAt(l) != s.charAt(r))    continue;
            while(l > 0 && r < n-1 && s.charAt(l-1) == s.charAt(r+1)){
                l--;
                r++;
            }
            if(r-l > right-left){
                right = r;
                left = l;
            }
        }
        return s.substring(left, right+1);
    }
}
- dp
维护一个二维dp数组,对于一个回文子串来说,如果j-i < 2,那么当i和j两个位置的字符相等的时候,是回文子串;如果j-i >= 2,那么除了字符串相等这个条件外,还需要满足dp[i+1][j-1] == true这个条件才能使字符串成为回文子串。
由于这里的i用到了i+1的状态,所以需要从后往前进行遍历。
class Solution {
    public String longestPalindrome(String s) {
        int n = s.length(), left = 0, right = 0;
        boolean dp[][] = new boolean[n][n];
        for(int i = n-1; i >= 0; i--){
            for(int j = i; j < n; j++){
                if(j-i < 2) dp[i][j] = s.charAt(i) == s.charAt(j);
                else
                    dp[i][j] = dp[i+1][j-1] && s.charAt(i) == s.charAt(j);
                if(dp[i][j] && j-i > right-left){
                    left = i;
                    right = j;
                }
            }
        }
        return s.substring(left, right+1);
    }
}
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号