1. 暴力破解: 使用两个for循环取出所有子串,再判断是不是回文,比较长度。
时间复杂度是o(),在LeetCode上是无法AC的。
2. 中心扩展:遍历字符串,以每一个点或两个点作为回文串的中心,向左右扩散,直到左右不相等,作为一个回文子串,再通过比较长度,取最长的。
public String longestPalindrome(String s) {
int len = s.length();
if (len == 0) {
return "";
}
int longestPalindrome = 1;
String longestPalindromeStr = s.substring(0, 1);
for (int i = 0; i < len; i++) {
String palindromeOdd = centerSpread(s, len, i, i);
String palindromeEven = centerSpread(s, len, i, i + 1);
String maxLenStr = palindromeOdd.length() > palindromeEven.length() ? palindromeOdd : palindromeEven;
if (maxLenStr.length() > longestPalindrome) {
longestPalindrome = maxLenStr.length();
longestPalindromeStr = maxLenStr;
}
}
return longestPalindromeStr;
}
private String centerSpread(String s, int len, int left, int right) {
int l = left;
int r = right;
while (l >= 0 && r < len && s.charAt(l) == s.charAt(r)) {
l--;
r++;
}
// 这里要特别小心,跳出 while 循环的时候,是第 1 个满足 s.charAt(l) != s.charAt(r) 的时候
// 所以,不能取 l,不能取 r
return s.substring(l + 1, r);
}
注:若以一个中心,则进函数时s.charAt(l) == s.charAt(r)
若回文串为偶数,以两个字符为中心,则这两个字符必须是一样的,如果不一样不可能是回文,也就不会进while循环。若字符不一样,此时l + 1= r,【r,r)中没有元素。