📜  门|门 IT 2006 |第 84 题(1)

📅  最后修改于: 2023-12-03 14:58:36.045000             🧑  作者: Mango

门|门 IT 2006 | 第 84 题

这是一道程序员们可以挑战的编程题目,出自于 2006 年的门|门 IT 比赛第 84 题。此题要求程序员设计一个算法,对一段字符串进行操作,从中找到最长的回文子串并返回。

问题描述

给定一个长度为 $n$ 的字符串 $s$,找出字符串中的最长回文子串。

回文字符串,指的是从左往右和从右往左读取都完全一样的字符串。

例如,字符串 "racecar" 就是一个回文字符串,因为从左往右和从右往左都为 "racecar"。

问题示例
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Input: "cbbd"
Output: "bb"
解法

回文子串的特点是中心对称,那么我们可以从字符串中心往两边探寻,通过比较字符是否一致来确定回文子串,并记录其中的最大值。

代码实现时,可以通过遍历字符串,以每个字符为中心点进行探索,同时对两种情况进行判断,即单个字符为中心和两个字符为中心的情况。

示例代码:

class Solution:
    def longestPalindrome(self, s: str) -> str:
        if not s:
            return ""
        n = len(s)
        left = right = 0
        for i in range(n):
            # 以单个字符为中心点探索
            l, r = i, i
            while l >= 0 and r < n and s[l] == s[r]:
                l -= 1
                r += 1
            if r - l - 1 > right - left:
                left, right = l + 1, r - 1

            # 以两个字符为中心点探索
            l, r = i, i + 1
            while l >= 0 and r < n and s[l] == s[r]:
                l -= 1
                r += 1
            if r - l - 1 > right - left:
                left, right = l + 1, r - 1

        return s[left:right+1]
总结

此题是一道经典而优雅的算法问题,算法核心部分基于探索对称性,程序员可以通过思考和实践加深对算法的理解,提高算法设计和实现能力。