LeetCode140-单词拆分 II In Python

这一题和上一题单词拆分1思想一样,但是实现更为复杂。这一题要求写出可以拆分成的单词们。

解题:试了暴力递归超时。上一题的动态规划思想在这一题中没法写出具体的种类。但是还是有一种记忆化的方法。直接上代码

代码:

class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> List[str]:
        return self.findword(s,wordDict,{})
    def findword(self,s,wordDict,m):
        #m是一个字典,key是字符串s,value是组成s的字符串们,
        #如果m中有s,那就直接返回就行
        if s in m:
            return m[s]
        #这里表示的是字符串递归寻找结束了,前面的单词都在字典中
        if not s:
            return 'ok'
        res=[]
        #对字典中的每一个单词都对比寻找
        for i in wordDict:
            if s[:len(i)]!=i:
                continue
            exres=self.findword(s[len(i):],wordDict,m)
            #返回的是ok,说明这个单词是这一次寻找的最后一个单词,且该单词在字典里,直接加入
            #到res即可
            if exres=='ok':
                res.append(i)
            #说明不是最后一个且s[len(i):]是由字典里面的单词组成
            elif exres:
                for j in exres:
                    res.append(i+' '+j)
            #还有一种当然就是返回[]了,就是s[len(i):]不是是由字典单词构成
#            elif not exres:
#                pass 
        m[s]=res
        return res

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值