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);
}
}

浙公网安备 33010602011771号