5. 最长回文子串(LeetCode)

class Solution {
    public String longestPalindrome(String s) {
        int len=s.length();
        if(len<1){
            return "";
        }
        int res=1,start=0;
        int[][] dp=new int[len][len];
        for(int i=0;i<len;i++){
            dp[i][i]=1;
            if(i<len-1){
                if(s.charAt(i)==s.charAt(i+1)){
                    dp[i][i+1]=1;
                    start=i;
                    res=2;
                }
                else{
                    dp[i][i+1]=0;
                }
            }
        }
        for(int i=2;i<len;i++){
            for(int j=0;j+i<len;j++){
                if(s.charAt(j)==s.charAt(i+j)&&dp[j+1][i+j-1]==1){
                    dp[j][i+j]=1;
                    start=j;
                    res=i+1;
                }else{
                    dp[j][i+j]=0;
                }
            }
        }
        return s.substring(start,start+res);
    }
}

此题使用动态规划思想,当dp[i+1][j-1]=1&&s[i]==s[j],则dp[i][j]=1,表示s(i,j)为回文串。
上面的一个for循环初始化dp数组,判断字符串s每两个字符是否为回文串。
下面的两个for循环,分别判断字符串S每k个字符是否为回文串(k=3,4,5,…S.length),记录下最大的回文串长度和该长度的所有回文串中最靠近S末尾的回文串的起始索引。最后返回这个回文串。

你可能感兴趣的:(数据结构与算法)