leetcode 5. Longest Palindromic Substring

题目内容

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

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

Input: "cbbd"
Output: "bb"

分析过程

  • 题目归类:
    array,dp
  • 题目分析:
    这种题应该是dp的解法,但是我还不是很会,就用非dp的解法实现第一个
    令 i= 0~ s.length()-1; j=i或者i+1,然后递归找相等的内容,把相等的保存下来。ij依次向外扩展,比较大小修改输出的string;
  • 边界分析:
    • 空值分析
    • 循环边界分析
  • 方法分析:
    • 数据结构分析
    • 状态机
    • 状态转移方程
    • 最优解
  • 测试用例构建

代码实现

class Solution {
    String sum = "";
    public String longestPalindrome(String s) {
        if(s==null || s.length() <2 )
            return s;
        for(int i = 0; i < s.length(); i++) {
            Palindrome(i,i+1,s);
            Palindrome(i,i,s);
        }
        return sum;
    }
    public void Palindrome(int m, int n, String s){
        if(m<0 || n>=s.length()||s.charAt(m)!=s.charAt(n)){
            return;
        }
        while(m>=0&&n<s.length()&&s.charAt(m) == s.charAt(n)){
            m--;
            n++;
        }
        sum = (sum.length()>=n-m-1)?sum:s.substring(m+1,n);
    }
}

效率提高

dp的方式 效率没有递归的方式快。

class Solution {
    public String longestPalindrome(String s) {
        
        if(s==null||s.length()<2){
            return s;
        }
        String ref = null;
        int length = s.length();
        boolean dp[][] = new boolean[length][length];
        for(int i = length-1; i>=0;i--){
            for(int j = i; j< length ; j++){
                dp[i][j] = s.charAt(i)==s.charAt(j)&&(j-i<3||dp[i+1][j-1]);//这个j-i<3是三个数时,a,aa,aba这三种情况可以不用判断dp[i+1][j-1]
                if(dp[i][j]&&(ref==null||ref.length()<j-i+1))
                    ref = s.substring(i,j+1);
            }
        }
        return ref;
    }
}

拓展问题

Shortest Palindrome Hard
Palindrome Permutation Easy
Palindrome Pairs Hard
Longest Palindromic Subsequence Medium
Palindromic Substrings Medium

posted @ 2020-02-09 12:32  clnsx  阅读(98)  评论(0编辑  收藏  举报