leetcode解题: Longest Palindromic Substring (5)

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

Example:

1
2
3
4
5
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.

Example:

1
2
3
Input: "cbbd"
Output: "bb"

解法1:DP: O(N^2)

字符串的问题,如果牵涉到substring(i,j)的,要是往dp方向上考虑就需要用二维的。这题也不例外。
dp[i][j]表示的是,(i,j)这个字符串是否是palindrome。
有三种情况可以考虑,一个是i == j, 一个是相邻,还有一个是距离大于2。
每次找到一个palindrome的时候都更新下max,同时也更新一下res的string。
要注意的是我们要求矩阵从下往上搜索,并且j >= i, 所以我们只搜索了上半部的矩阵。
Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class Solution {
public String longestPalindrome(String s) {
int n = s.length();
boolean[][] state = new boolean[n][n];
int maxlen = Integer.MIN_VALUE;
String res = "";
for (int i = n - 1; i >= 0; i--) {
for (int j = i; j < n; j++) {
if (i == j) {
state[i][j] = true;
} else if (j == i + 1) {
state[i][j] = s.charAt(i) == s.charAt(j);
} else {
state[i][j] = s.charAt(i) == s.charAt(j) && state[i + 1][j - 1];
}
if (state[i][j]) {
int len = j - i + 1;
if (len > maxlen) {
maxlen = len;
res = s.substring(i, j + 1);
}
}
}
}
return res;
}
}

解法2:O(n^2) Time, O(1) Space

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Solution {
public String longestPalindrome(String s) {
if (s == null) {
return s;
}
// loop through each possible expanding center
int start = 0, end = 0;
int maxLen = Integer.MIN_VALUE;
for (int i = 0; i < s.length(); i++) {
int len1 = expand(s, i, i);
int len2 = expand(s, i, i + 1);
int len = Math.max(len1, len2);
if (len > end - start) {
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
return s.substring(start, end + 1);
}
private int expand(String s, int left, int right) {
int L = left, R = right;
while (L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)) {
L--;
R++;
}
return R - L - 1;
}
}