最长回文子串
描述
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
示例 3:
输入:s = “a”
输出:“a”
示例 4:
输入:s = “ac”
输出:“a”
答案一
public String longestPalindrome1(String s) {
int len = s.length();
if (len < 2) {
return s;
}
int maxLen =1;
int begin = 0;
char[] chars = s.toCharArray();
for (int i = 0; i < len - 1; i++) {
for (int j = i+1; j < len; j++) {
if (j-i+1 > maxLen && validPalindromic(chars,i,j)) {
maxLen = j-i+1;
begin = i;
}
}
}
return s.substring(begin,begin+maxLen);
}
private boolean validPalindromic(char[] chars,int i,int j){
while (i<j) {
if (chars[i] != chars[j]) {
return false;
}
i++;
j--;
}
return true;
}
答案二
public String longestPalindrome2(String s) {
int len = s.length();
if (len < 2) {
return s;
}
int maxLen =1;
int begin = 0;
char[] chars = s.toCharArray();
for (int i = 0; i < len - 1; i++) {
int oldLen = expandAroundCenter(chars,i,i);
int evenLen = expandAroundCenter(chars,i,i+1);
int curMaxLen = Math.max(oldLen,evenLen);
if (curMaxLen>maxLen) {
maxLen = curMaxLen;
begin = i - (maxLen-1)/2;
}
}
return s.substring(begin,begin+maxLen);
}
private int expandAroundCenter(char[] chars,int i,int j){
int len = chars.length;
while (i>=0 && j<len) {
if (chars[i] == chars[j]) {
i--;
j++;
} else {
break;
}
}
return j-i-1;
}
答案三
public String longestPalindrome3(String s) {
int len = s.length();
if (len < 2) {
return s;
}
int maxLen =1;
int begin = 0;
//dp[i][j]表示是[i,j]是否是回文串
boolean[][] dp = new boolean[len][len];
for (int i = 0; i < len; i++) {
dp[i][i] = true;
}
char[] chars = s.toCharArray();
for (int j = 1; j < len; j++) {
for (int i = 0; i < j; i++) {
if (chars[i] != chars[j]) {
dp[i][j] = false;
} else {
if (j-i<3) {
dp[i][j] = true;
} else {
dp[i][j] = dp[i+1][j-1];
}
}
if (dp[i][j] && j-i+1>maxLen) {
maxLen = j-i+1;
begin = i;
}
}
}
return s.substring(begin,begin+maxLen);
}