Longest Palindrome Substring

蹲街弑〆低调 提交于 2020-02-04 18:31:50

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"

思路:有中心生长法,就是判断所有的palindrome,比较长度之后,返回最大值,palindrome分odd和even

class Solution {
    public String longestPalindrome(String s) {
        if(s == null || s.length() == 0) {
            return s;
        }
        String maxstr = "";
        for(int i = 0; i < s.length(); i++) {
            String oddstr = findPalindrome(s, i, i);
            if(oddstr.length() > maxstr.length()){
                maxstr = oddstr;
            }
        }
        
        for(int i = 0; i < s.length(); i++) {
            String evenstr = findPalindrome(s, i, i+1);
            if(evenstr.length() > maxstr.length()) {
                maxstr = evenstr;
            }
        }
        return maxstr;
    }
    
    private String findPalindrome(String s, int i, int j) {
        while(0 <= i && j < s.length()) {
            if(s.charAt(i) == s.charAt(j)){
                i--;
                j++;
            } else {
                break;
            }
        }
        return s.substring(i+1, j);
    }
}

思路2:用区间型动态规划,f[i][j] 表示 s[i...j]中间是否是palindrome;如果s[i] == s[j] 并且 f[i+1][j-1] == true,那么palindrome可以往外生长2个char,f[i][j] = true,如果j - i + 1 > maxlen,更新start,end的index;最后return substring(start, end+1);

class Solution {
    public String longestPalindrome(String s) {
        if(s == null || s.length() == 0) {
            return s;
        }
        int n = s.length();
        boolean[][] f = new boolean[n][n];
        for(int i = 0; i < n; i++) {
            f[i][i] = true;
        }
       
        char[] ss = s.toCharArray();
        int start = 0; 
        int end = 0;
         int maxlen = 0;
        for(int i = n - 1; i >= 0; i--) {
            for(int j = i + 1; j < n; j++) {
                if(ss[i] != ss[j]) {
                    f[i][j] = false;
                } else {
                    // ss[i] == ss[j];
                    if(j - i <= 2 || f[i+1][j-1]) {
                        f[i][j] = true;
                        if(j - i + 1 > maxlen) {
                            maxlen = j - i + 1;
                            start = i;
                            end = j;
                        }
                    }
                }
            }
        }
        return s.substring(start, end + 1);
    }
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!