解法 1: 暴力破解
暴力求解,列举所有的子串,判断是否为回文串,保存最长的回文串
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 ans = "";
int max = 0;
int len = s.length();
for (int i = 0; i < len; i++)
for (int j = i + 1; j <= len; j++) {
String test = s.substring(i, j);
if (isPalindromic(test) && test.length() > max) {
ans = s.substring(i, j);
max = Math.max(max, ans.length());
}
}
return ans;
}
解法 2: 扩展中心
思路分析
第一次检查的是字符串是奇数的情况下i刚好是中心。
第二次检查是字符串是偶数则需要检查i和i+1是否越界及其是否相等,然后left-- ,right++ 继续判断是否相等。
class Solution {
private int start = 0, maxLength = 1;
public String longestPalindrome(String s) {
if (s.length() < 2) {
return s;
}
for (int i = 0; i < s.length(); i++) {
expandAroundCenter(s, i - 1, i + 1);
expandAroundCenter(s, i, i + 1);
}
return s.substring(start, start + maxLength);
}
private void expandAroundCenter(String s, int left, int right) {
while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
if (right - left + 1 > maxLength) {
maxLength = right - left + 1;
start = left;
}
left--;
right++;
}
}
}