LeetCode 5. Longest Palindromic Substring?

Given a string s, return the longest palindromic substring in s.
return that longest palindrome.

this is not some regular dp problems, if i first saw this problem, there is no way I will think of this a dp problem. because we need to return the actual palindrome instead of the length.

the sad thing is, even though I know this problem can be solved in DP, i still can’t implement it.
不过的确是自己思维太过于局限了 一维不行就二维
想一想dp[i] [j]可以代表什么代表ij之间的的子字符串是不是回文的
dp[i][j] = if (s.char(i) == s.charAt(j)) && (j - i <= 2 || dp[i + 1][j - 1])

可是我写出的代码:但是就是无法AC

class Solution {
    public String longestPalindrome(String s) {
        String res = "";
        if (s == null || s.length() == 0) {
            return res;
        }
        if (s.length() == 1) return s;
        int m = s.length();
        boolean[][] dp = new boolean[m][m];
        
        int maxLen = Integer.MIN_VALUE;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j <= i; j++) {
                dp[i][j] = (s.charAt(i) == s.charAt(j)) && ((i - 1- j - 1 + 1 <= 1) || dp[j+1][i-1]);
                if (dp[i][j]) {
                    if (i - j + 1 > maxLen) {
                        maxLen = i - j + 1;
                        res = s.substring(j, i+1);
                    }
                }
            }
        }
        return res;   
    }
}

但是下面的代码却可以,真的抽象

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

但是用DP做这道题就有点慢了 不如直接从每个地方exapnd快 expand并检查。

class Solution {
  public String longestPalindrome(String s) {
    if (s.length() == 1 || s.length() == 0) {
      return s;
    }
    String result = "";
    for (int index = 1; index < s.length(); index++) {
      //odd center
      String sOdd = expandFromCenter(index, index, s);
      result = sOdd.length() > result.length() ? sOdd : result;
      
      //even center 
      String sEven = expandFromCenter(index - 1, index, s);
      result = sEven.length() > result.length() ? sEven : result;
  
    }
    return result;
  }
  
  public String expandFromCenter(int left, int right, String s) {
    while (left >= 0 && right < s.length()) {
      if (s.charAt(left) != s.charAt(right)) {
        break;
      }
      left--;
      right++;
    }
    return left < 0 || right >= s.length() || s.charAt(left) != s.charAt(right) ? s.substring(left + 1, right) : s.substring(left, right);
  }
}

posted @ 2020-11-22 11:40  EvanMeetTheWorld  阅读(23)  评论(0)    收藏  举报