每天一题LeetCode【第5天】

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;
    }
}}

你可能感兴趣的:(每天一题LeetCode【第5天】)