题目

给定一个字符串s,找到s中最长的回文子串。你可以假设 s的最大长度为 1000。

思路

动态规划

P(i,j) = (P(i+1,j-1) and Si == Sj)

代码

ps:注意这里外面的for用的是长度,直接下标i循环也是可以的

class Solution {
    public String longestPalindrome(String s) {
        int str_len = s.length();
        boolean[][] sign = new boolean[str_len][str_len];
        String res = "";
        for(int length = 1;length <= str_len;length++){
            for(int start = 0;start < str_len;start++){
                int end = start + length - 1;
                if(end >= str_len) break;
                if(length == 1){
                    sign[start][end] = true;
                }
                else if(length == 2){
                    if(s.charAt(start) == s.charAt(end))sign[start][end] = true;
                }
                else{
                    if(s.charAt(start) == s.charAt(end) && sign[start+1][end-1]){
                        sign[start][end] = true;
                    }
                }
                if(sign[start][end] == true)res = s.substring(start,end+1); 
            }
        }
        return res;
    }
}

马拉车算法

class Solution {
    public String longestPalindrome(String s) {
        String  tString = "$#";
        for(int i = 0;i < s.length();i++){
            tString += s.charAt(i);
            tString += "#";
        }
        int[] p = new int[tString.length()];
        int mx = 0, id = 0,resLen = 0,resCenter = 0;
        for(int i = 1;i < tString.length();i++){
            p[i] = mx > i ? Math.min(p[2*id - i], mx - i):1;
            while(i+p[i] < tString.length()&&i-p[i] >= 0&& tString.charAt(i + p[i]) == tString.charAt(i - p[i]))++p[i];
            if(mx < i + p[i]){
                mx = i + p[i];
                id = i;
            }
            if(resLen < p[i]){
                resLen = p[i];
                resCenter = i;
            }
            
        }
        return s.substring((resCenter - resLen)/2,(resCenter - resLen)/2 + resLen - 1);
        
        
    }
}

canyue
1 声望1 粉丝