Leetcode题解1:最长回文子串 JAVA

Leetcode题解1:最长回文子串 JAVA

题目

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

Example 1:

Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.

Example 2:

Input: "cbbd"
Output: "bb"

解法:动态规划算法

边界条件:1. 一个字符组成的字符串肯定是回文字符串

	    2. 两个相同字符组成的字符串肯定也是回文字符串

递推条件:如果α是回文串,那么aαa也是回文字符串

边界条件中我们已经得到了长度为1以及长度为2的回文字符串,然后由长度为一的回文串我们可以得到长度为三的回文串,由长度为2的回文串我们可以得到长度为4的回文串,依此类推。

实现代码如下:

class Solution {
    public String longestPalindrome(String s) {
        int length = s.length();
        boolean[][] p = new boolean[length][length];
        int st=0,ed=0,flag = 0;
        for(int i = 0;i < length;i++){ // 设置边界条件,长度为1和长度为2的回文串
            p[i][i]=true;
            if(i+1<length&&s.charAt(i)==s.charAt(i+1)) p[i][i+1]=true;
        }
        for(int len = 1;len <= length-2;len++){ //递推条件,从长度为1的串向外扩展
            for(int j = 1;j <= length-len-1;j++){ // 串的开始位置,从1开始
                if(p[j][j+len-1]){
                    if(s.charAt(j-1)==s.charAt(j+len)){
                        p[j-1][j+len]=true;
                    }
                }
            }
        }
        for(int len = length;len>0;len--){ // 从长到短遍历,如果找到,则输出
            for(int i = 0;i <= length-len;i++){
                if(p[i][i+len-1]){
                    st = i;
                    ed = i+len;
                    flag = 1;
                    break;
                }
            }
            if(flag ==1) break;   
        }
        return s.equals("")?"":s.substring(st,ed);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_37994110/article/details/87885385