5. 最长回文子串
1.题目分析
- 寻找回文串的核心思想是,从中间向两边扩散;
- 注意:要想取处String的start~end下标的局部串,必须这样写:s.substring(start,end+1);
2.代码
class Solution {
public String longestPalindrome(String s) {
int start = 0, end = 0;
for (int i = 0; i < s.length(); i++) {
奇数长度的回文串
int len1 = palindrome(s,i,i);
偶数长度的回文串
int len2 = palindrome(s,i,i+1);
int len = Math.max(len1, len2);
这里求 start 、end 考虑到了奇偶不同情况的共性,可以自己举个例子看看
if (len > end - start) {
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
return s.substring(start,end+1);
}
辅助函数 寻找以 l,r为中心的回文串长度
public int palindrome(String s, int l, int r){
while (l>=0 && r<s.length() && s.charAt(l)==s.charAt(r)){
l--;
r++;
}
此时l、r对应的元素并非回文串的部分,两者均需要向里进1步
返回回文串的长度
return r - l - 1;
}
}
或者下边这种解法:
class Solution {
public String longestPalindrome(String s) {
String res = "";
for (int i = 0; i < s.length(); i++) {
奇数长度的回文串
String str1 = palindrome(s,i,i);
偶数长度的回文串
String str2 = palindrome(s,i,i+1);
res = res.length() > str1.length() ? res : str1;
res = res.length() > str2.length() ? res : str2;
}
return res;
}
辅助函数 寻找以 l,r为中心的回文串
public String palindrome(String s, int l, int r){
while (l>=0 && r<s.length() && s.charAt(l)==s.charAt(r)){
l--;
r++;
}
return s.substring(l+1,r-1+1);
}
}