伴你如风、护你如影|

xzh-yyds

园龄:3年9个月粉丝:0关注:2

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);
    }
}

本文作者:xzh-yyds

本文链接:https://www.cnblogs.com/xzh-yyds/p/16598397.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   xzh-yyds  阅读(6)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开