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);
}
}
来源:CSDN
作者:flyatcmu
链接:https://blog.csdn.net/u013325815/article/details/104169669