LeetCode-131(medium)分割回文串

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

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

示例:

输入: "aab"
输出:
[
  ["aa","b"],
  ["a","a","b"]
]

 

思路:列出所有可能的分割方案,想到的是深度优先搜索,回溯算法,  22-括号生成,生成所有可能出现的括号

回溯算法

对于回溯法来说,必须齐备的三要素:

1、选择。在这个例子中,解就是一个合法的括号组合形式,而选择无非是放入左括号,还是放入右括号

2、条件。在这个例子中,选择是放入左括号,还是放入右括号,是有条件约束的,不是随便放的。而这个约束就是括号的数量。只有剩下的右括号比左括号多,才能放右括号。只有左括号数量大于0才能放入左括号。这里if的顺序会影响输出的顺序,但是不影响最终解;

3、结束。这里的结束条件很显然就是,左右括号都放完了。

 对于这道题来说

1,选择的是下一个元素,

2.条件是每个子串都是回文串,

3.结束是所有字符都遍历完了

python实现

class Solution:
    def partition(self, s: str) -> List[List[str]]:
        res = []
        self.dfs(s, [], res)
        return res

    def dfs(self, s, lis, res):
        if not s:    # 如果这一次的遍历完了,就把path放入res中,这是一个结束条件!
            res.append(lis)
            return
        for i in range(1, len(s)+1):  
            if self.isPal(s[:i]):     #如果是回文数,添加到path中,这是条件!
                self.dfs(s[i:], lis+[s[:i]], res)     #选择之后的元素!

    def isPal(self, s):
        return s == s[::-1]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值