方法一:
暴力枚举所有子串,进行回文串判断并获取最长。
public boolean isPalindromic(String s) {
int len = s.length();
for (int i = 0; i < len / 2; i++) {
if (s.charAt(i) != s.charAt(len - i - 1)) {
return false;
}
}
return true;
}
// 暴力解法
public String longestPalindrome(String s) {
String res = "";
for (int i = 0; i < s.length(); i++) {
for (int j = i + 1; j <= s.length(); j++) {
String temp = s.substring(i, j);
if (isPalindromic(temp) && temp.length() > res.length()) {
res = temp;
}
}
}
return res;
}
回文子串判断即将子串前后分为两部分,判断两部分对应位置字符是否相同。
双重遍历原串,取出两次遍历i、j之间组成的子串,判断回文和长度即可。
方法二:
中央扩散:
遍历字符串,以遇到的字符为中心,向两边扩散查找。
public String longestPalindrome(String s) {
int left = 0;
int right = 0;
int max = 0;
int maxStart = 0;
int len = 1;
for (int i = 0; i < s.length(); i++) {
left = i - 1;
right = i + 1;
while (left >= 0 && s.charAt(left) == s.charAt(i)) {
len++;
left--;
}
while (right < s.length() && s.charAt(right) == s.charAt(i)) {
len++;
right++;
}
while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
len += 2;
left--;
right++;
}
if (len > max) {
max = len;
maxStart = left;
}
len = 1;
}
return s.substring(maxStart + 1, maxStart + max + 1);
}