[LeetCode Python3]139. Word Break +暴力递归 + 带备忘录的递归

暴力递归

class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> bool:
        def helper(tmps):
            if not tmps:    # tmps为空字符串是返回真
                return True
            for i in range(1, len(tmps)+1):
                if tmps[:i] in wordDict:    # 当tmps[:i]在wordDict中时,就转换为子问题:判断tmps[i:]是否可由wordDict中的词组成
                    if helper(tmps[i:]):
                        return True
            return False
        return helper(s)

该版本时间超时,是因为大量重复子问题计算。
可通过添加备忘录避免重复计算相同子问题

带备忘录的递归

class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> bool:
        dic = {}

        def helper(tmps):
            if not tmps:
                return True
            # 将tmps是否可由wordDict中词构成的结果存到dic中,
            if tmps in dic: # 当判断tmps存在于dic时,说明该问题已经计算过可直接返回结果。
                return dic[tmps]
            else:
                for i in range(1, len(tmps)+1):
                    if tmps[:i] in wordDict:
                        if helper(tmps[i:]):
                            dic[tmps] = True
                            return True
                dic[tmps] = False
                return False
        return helper(s)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值