[和小菜鸡一起刷题(python)] LeetCode 131. 分割回文串 (Palindrome Partitioning)

本文深入解析了LeetCode131分割回文串问题,通过回溯算法实现字符串的分割,使每个子串都是回文串。详细介绍了算法思路,包括判断回文串的方法和递归分割过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LeetCode 131. 分割回文串 (Palindrome Partitioning)

原题

给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。

返回 s 所有可能的分割方案。

示例:

输入: “aab”
输出:
[
[“aa”,“b”],
[“a”,“a”,“b”]
]

思路

题目要求返回所有的可能方案,所以依旧采用回溯算法。循环查看当前字符串的每一个可切分位置位;判断若在当前位置切分,前半部分是否是回文串。若是,则将前半部分存入当前解,并递归分割后半部分。
例如输入字符串为示例:
|a  |a  |b  |
0 1 2 3 
首先判断分割位1,发现前半部分‘a’是回文串,将‘a’存入cur_res,将后半部分‘ab’用作递归。当输入字符串为空时,递归结束,将cur_res加入的result,最终返回result。

代码

class Solution(object):
    def partition(self, s):
        """
        :type s: str
        :rtype: List[List[str]]
        """
        if len(s) == 0:
            return []
        else:
            res = []
            self.partition_helper(s, [], res)
        return res

    def partition_helper(self, s, cur_res, result):
        if len(s) == 0:
            result.append(cur_res)
        for i in range(1, len(s)+1):
            if self.check(s[:i]):
                self.partition_helper(s[i:], cur_res + [s[:i]], result)


    def check(self, s):
        if len(s) == 0:
            return False
        else:
            start = 0
            end = len(s) - 1
            while start <= end:
                if s[start] != s[end]:
                    return False
                else:
                    start += 1
                    end -= 1
            return True
### LeetCode 第 5 &#39;最长回文子串&#39; 的 Python 解法 对于给定字符串 `s`,返回其中的最长回文子串是一个经典算法。一种高效的解决方案是利用中心扩展方法来寻找可能的最大长度回文。 #### 中心扩展法解析 该方法基于观察到的一个事实:一个回文串可以由中间向两端不断扩散而得。因此可以从每一个字符位置出发尝试构建尽可能大的回文序列[^1]。 具体来说: - 对于每个字符作为单个字符的中心点; - 或者两个相同相邻字符作为一个整体中心点; - 向两侧延伸直到遇到不匹配的情况为止; 记录下每次找到的有效回文串及其起始索引结束索引,并更新全局最优解。 下面是具体的 Python 实现代码: ```python def longest_palindrome(s: str) -> str: if not s or len(s) == 0: return "" start, end = 0, 0 for i in range(len(s)): len1 = expand_around_center(s, i, i) len2 = expand_around_center(s, i, i + 1) max_len = max(len1, len2) if max_len > end - start: start = i - (max_len - 1) // 2 end = i + max_len // 2 return s[start:end + 1] def expand_around_center(s: str, left: int, right: int) -> int: L, R = left, right while L >= 0 and R < len(s) and s[L] == s[R]: L -= 1 R += 1 return R - L - 1 ``` 此函数通过遍历整个输入字符串并调用辅助函数 `expand_around_center()` 来计算以当前位置为中心能够形成的最长回文串长度。最终得到的结果即为所求的最大回文子串。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值