返回

一招制胜:掌握中心扩散法,搞定最长回文子串问题

前端

中心扩散法:寻找字符串中的最长回文子串

在处理字符串问题时,回文子串是一个常见的难题。回文子串是一个从左到右和从右到左读起来都相同的字符串。比如 "racecar" 和 "madam"。找到一个字符串中的最长回文子串是很有用的,在文本处理、生物信息学和其他领域都有应用。

中心扩散法

中心扩散法是一种有效的方法,可以找到字符串中的最长回文子串。它的工作原理是:

  1. 从字符串的每个字符开始: 从字符串的第一个字符开始,向两边扩展,检查是否可以形成回文子串。
  2. 向两边扩展: 继续向两边扩展,直到字符不再相等。
  3. 记录最长回文子串: 在扩展过程中,记录找到的最长回文子串。
  4. 重复步骤: 重复这些步骤,直到遍历完整个字符串。

算法实现

用 Python 实现中心扩散法:

def longest_palindrome(string):
    """
    找到字符串中最长的回文子串。

    参数:
    string: 输入字符串。

    返回:
    最长回文子串。
    """

    # 初始化最长回文子串为一个空字符串。
    longest_palindrome = ""

    # 遍历字符串中的每个字符。
    for i in range(len(string)):
        # 从当前字符开始,向两边扩展,形成回文子串。
        left, right = i, i
        while left >= 0 and right < len(string) and string[left] == string[right]:
            # 如果当前回文子串比最长回文子串长,则更新最长回文子串。
            if right - left + 1 > len(longest_palindrome):
                longest_palindrome = string[left:right + 1]

            # 向两边扩展回文子串。
            left -= 1
            right += 1

        # 从当前字符及其右邻字符开始,形成回文子串。
        left, right = i, i + 1
        while left >= 0 and right < len(string) and string[left] == string[right]:
            # 如果当前回文子串比最长回文子串长,则更新最长回文子串。
            if right - left + 1 > len(longest_palindrome):
                longest_palindrome = string[left:right + 1]

            # 向两边扩展回文子串。
            left -= 1
            right += 1

    # 返回最长回文子串。
    return longest_palindrome

算法复杂度

中心扩散法的时间复杂度为 O(n^2),其中 n 是字符串的长度。这是因为算法需要遍历字符串的每个字符,并为每个字符向两边扩展。

实例

假设我们有一个字符串 "babad"。中心扩散法将执行以下步骤:

  1. 从 'b' 开始: 从 'b' 开始,向两边扩展形成回文子串 "b"。
  2. 从 'a' 开始: 从 'a' 开始,向两边扩展形成回文子串 "a"。
  3. 从 'b' 开始: 从第二个 'b' 开始,向两边扩展形成回文子串 "bab"。
  4. 从 'a' 开始: 从 'a' 开始,向两边扩展形成回文子串 "aba"。
  5. 从 'd' 开始: 从 'd' 开始,向两边扩展形成回文子串 "d"。

结论

中心扩散法是一种有效且直接的方法,用于查找字符串中的最长回文子串。它的时间复杂度为 O(n^2),并可以用于解决各种文本处理问题。

常见问题解答

  1. 中心扩散法适用于所有字符串吗?

    • 是的,中心扩散法适用于任何字符串。
  2. 中心扩散法可以找到重叠的回文子串吗?

    • 是的,中心扩散法可以找到重叠的回文子串。
  3. 中心扩散法可以在线性时间内找到最长回文子串吗?

    • 不,中心扩散法的时间复杂度为 O(n^2),不能在线性时间内找到最长回文子串。
  4. 中心扩散法可以并行化吗?

    • 是的,中心扩散法可以并行化,以提高性能。
  5. 中心扩散法可以修改以找到最短回文子串吗?

    • 是的,中心扩散法可以稍作修改以找到最短回文子串。