最长回文字符串

什么是回文子串

回文子串,就是正着读和反正读是一样的字符串,比如 “上海自来水来自海上”

发音

palindrome 回文的
[ˈpælɪndroʊm]

解法

有3个解法

  1. 暴力解法 O(n^3)
  2. Manacher’s Algorithm O(n)
  3. 中心点枚举法 O(n^2)
  4. 动态规划 O(n^2)

中心点枚举法

使用双指针解答
分为两种情况

  1. 中心点是偶数
  2. 中心点是奇数

偶数

eab|bac 
012 345
    L R

偶数的情况下可以明确看到中心点是2和3中间的空隙。这个情况下
[i,i+1]

奇数

eabbace
0123456
 (LR)

奇数的情况下可以看到中心点是index = 3

题解

class Solution {
    public String longestPalindrome(String s) {
        // 异常
        if (null == s) {
            return null;
        }

        String longest = "";
        for (int i = 0; i < s.length(); i ++) {
            String odd = isPalindrome(s, i, i);

            if (longest.length() < odd.length()) {
                longest = odd;
            }

            String even = isPalindrome(s, i, i + 1);
            
            if (longest.length() < even.length()) {
                longest = even;
            }
        }

        return longest;
    }

    public String isPalindrome(String s, int left, int right) {

        while (left >= 0 && right < s.length()) {
            if (s.charAt(left) != s.charAt(right)) {
                // 左右指针不相等的话,表示不是回文字符串
                break;
            }

            left--;
            right++;
        }

        return s.substring(left + 1, right);
    }
}
posted @ 2022-02-08 22:49  amberbar  阅读(41)  评论(0编辑  收藏  举报