原题地址:https://leetcode.com/problems/longest-palindromic-substring/
题目要求是:在一个字符串中寻找最长的回文子串。何谓“回文”?就是从左往右念和从右往左念,结果都一样。例如“aba”就是一个回文字符串,“abba”也是一个回文字符串。中国古代也有很多“回文”形式对联和诗句,比如“雾锁山头山锁雾,天连水尾水连天”。
观察一下回文的特点:有一个中心点,从这个中心点开始向外扩散,它的左边和右边的字符都是对称的。
假设字符串的长度是N,那么一共有多少个中心点呢?答案是2N - 1个,因为中心点也可能位于两个字符之间,比如前文提到的“abba”。
选好了中心点,然后就是查找以它为中心的最长回文子串,最后返回最长的那个。判断是否是回文的方法也比较直观,只要比较左边和右边的字符是否相等,再判断左边的左边和右边的右边字符是否相等,以此类推。
最后要注意的一点是substring()这个方法是前闭后开的,要取全的话第2个索引参数要加1。
具体代码实现:
public class Solution {
public String longestPalindrome(String s) {
int len1 = 0;
int len2 = 0;
int start = 0;
int end = 0;
int maxLen = 0;
for (int i = 0; i < s.length(); i++) {
len1 = checkPalindrome(s, i, i);
len2 = checkPalindrome(s, i, i+1);
maxLen = Math.max(len1, len2);
if (maxLen > end - start) {
start = i - (maxLen - 1) / 2;
end = i + maxLen / 2;
}
}
return s.substring(start, end + 1);
}
private int checkPalindrome(String s, int left, int right) {
int L = left;
int R = right;
while (L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)) {
L--;
R++;
}
return R - L - 1;
}
}