T5. Longest Palindromic Substring 【Medium】
题目
给出一个 string 串 s,找到里面最长的回文串。你可以假设 s 最长的长度是 1000。
回文串:一个正读和反读都一样的字符串
示例1:
输入: "babad"
输出: "bab"
提示: "aba" 也是一个正确的解答.
示例2:
输入: "cbbd"
输出: "bb"
思路
主要思路:
回文串分成奇数和偶数两种,通过从中心向外扩散来找对应的串。然后循环从左到右更换中心点。
示例:
'|'对应的是指向的标号
奇数串 babaacd babaacd babaacd 得到串aba
| | | | |
偶数串 babaacd babaacd 得到串aa
|| | |
具体可以看下面的代码以及注释
代码
代码取自 Top Solution,稍作注释
public class Solution {
//lo表示回文字符串首字符序号,macLen表示回文子串的长度
private int lo, maxLen;
public String longestPalindrome(String s) {
//得到字符串长度
int len = s.length();
//若长度小于2,则就是回文,直接返回
if (len < 2)
return s;
//用for循环一个个试过去
for (int i = 0; i < len-1; i++) {
//当回文串是奇数的时候
extendPalindrome(s, i, i);
//当回文串是偶数的时候
extendPalindrome(s, i, i+1);
}
//返回最长回文串
return s.substring(lo, lo + maxLen);
}
//从中间往外扩散然后得到回文串
private void extendPalindrome(String s, int j, int k) {
while (j >= 0 && k < s.length() && s.charAt(j) == s.charAt(k)) {
//通过j--,k++向外扩散
j--;
k++;
}
//当找到比较长的串时保存串初始符号位置以及长度
if (maxLen < k - j - 1) {
lo = j + 1;
maxLen = k - j - 1;
}
}}