LeetCode 5. Longest Palindromic Substring [Medium]

题目来源:https://leetcode.com/problems/longest-palindromic-substring/

题目难度:Medium

题目

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

Example 1:

1
2
3
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.

Example 2:

1
2
Input: "cbbd"
Output: "bb"

解答1[Java]

解答2[Java]

使用 S 表示原字符串

使用 T 表示转换过后的字符串

使用 C 表示目前已知的子回文串中,右边界的位置最大的那个子回文串的中心。

使用 R 表示以 C 为中心的回文串的最右端的位置。

使用 i 表示 T 中正要确定回文串长度的一个位置。

使用 i’ 表示以 C 为中心,i 的对称位置

假设字符串 S 为 babcbabcbaccba

转换为字符串 T:#b#a#b#c#b#a#b#c#b#a#c#c#b#a#

考虑以下三种情况:

情况1:i’ 的回文串的左边界不超过 C 的回文串的左边界。

这种情况下,P[i] = P[i’]

情况2:i’ 的回文串的左边界超过了 C 的回文串的左边界。

这种情况下,i 的右边界不可能超过 C 的右边界,因为如果 i 的右边界超过了 C 的右边界,则证明 C 的回文串的长度还能更长。

情况3:i’ 的回文串的左边界和 C 的回文串的左边界相同。

参考资料

  1. Programming Problems and Competitions :: HackerRank
  2. https://algs4.cs.princeton.edu/53substring/Manacher.java.html
  3. 有什么浅显易懂的Manacher Algorithm讲解? - 知乎