算法實踐:leetcode5 最長迴文子串

leetcode5: 最長迴文子串

描述

給定一個字符串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度爲 1000。

樣例

輸入: "babad"
輸出: "bab"
注意: "aba" 也是一個有效答案。

難度

中,動態規劃

解法

在這裏插入圖片描述

在這裏插入圖片描述

代碼

class Solution {
    public String longestPalindrome(String s) {
        int length = s.length();
        int start=0;//記錄最大回文子串的開始位置
        int maxlength=1;//記錄最大回文子串的長度
        int[][] ss = new int[length][length];
        if(length<=1) return s;
        //初始化對角線上元素
        for(int i=0;i<length;i++)
            ss[i][i] = 1;
        for(int i=1;i<length;i++)  //注意填表的順序,先從(j,i)的i開始填表
            for(int j=0;j<i;j++){
                if(s.charAt(i)==s.charAt(j)){ //如果如果兩個相等字符之間只有一個字符,那麼一定迴文
                    if(i-j<3)  ss[j][i]=1;
                    else   ss[j][i]=ss[j+1][i-1];
                }
                if(ss[j][i]==1){
                    if(i-j+1>maxlength){
                        maxlength=i-j+1;
                        start=j;
                    }
                }
            }
        return s.substring(start,start+maxlength);
    }
}

另解:中心擴展法

在這裏插入圖片描述

public String longestPalindrome(String s) {
    if (s == null || s.length() < 1) return "";
    int start = 0, end = 0;
    for (int i = 0; i < s.length(); i++) {
        int len1 = expandAroundCenter(s, i, i);
        int len2 = expandAroundCenter(s, i, i + 1);
        int len = Math.max(len1, len2);
        if (len > end - start) {
            start = i - (len - 1) / 2;
            end = i + len / 2;
        }
    }
    return s.substring(start, end + 1);
}

private int expandAroundCenter(String s, int left, int right) {
    int L = left, R = right;
    while (L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)) {
        L--;
        R++;
    }
    return R - L - 1;
}

空間複雜度降爲O(1)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章