LeetCode05 最长回文子串
暴力解法
public String longestPalindrome(String s) {
int max = 0;
int start = 0;
int n = s.length();
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
if (isReverseStr(s.substring(i, j + 1))) {
if (j - i + 1 > max) {
max = j - i + 1;
start = i;
}
}
}
}
return s.substring(start, start + max);
}
public boolean isReverseStr(String str) {
if (str == null) {
return true;
}
if (str.isEmpty()) {
return true;
}
int n = str.length();
int mid = n >> 1;
for (int i = 0; i <= mid; i++) {
if (str.charAt(i) != str.charAt(n - 1 - i)) {
return false;
}
}
return true;
}
动态规划
对于一个子串而言,如果它是回文串,并且长度大于
2
2,那么将它首尾的两个字母去除之后,它仍然是个回文串。例如对于字符串
“ababa”
“ababa”,如果我们已经知道
“bab”
“bab” 是回文串,那么
“ababa”
“ababa” 一定是回文串
中心扩散法
每一个回文串都有自己的中心,遍历每一个可能的中心,逐渐向两边扩散
public String longestPalindrome(String s) {
int max = 0;
int mid = 0;
int n = s.length();
for (int i = 0; i < n; i++) {
int len1 = maxPalindrome(s, i, i);
int len2 = maxPalindrome(s, i, i + 1);
if (len1 > max || len2 > max) {
max = len1 > len2 ? len1 : len2;
mid = i;
}
}
return s.substring(mid - (max - 1) / 2, mid + max / 2 + 1);
}
public int maxPalindrome(String s, int left, int right) {
int n = s.length();
while (left >= 0 && right < n && s.charAt(left) == s.charAt(right)) {
left--;
right++;
}
return right - left - 1;
}