Leetcode_6_Dynamic Programming_139,140单词拆分,单词拆分II

139、单词拆分

动态规划法,状态意为某处字符之前到它自身的头部是否为True.

class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> bool:
        size=len(s)
        dic={word for word in wordDict}
        dp=[False for _ in range(size)]

        dp[0]=s[0] in dic

        for i in range(1,size):
            if s[:i+1] in dic:
                dp[i]=True
                continue
            for j in range(i):
                if dp[j] and s[j+1:i+1] in dic:
                    dp[i]=True
                    break

        return dp[-1]

140、单词拆分II

递归(较难理解,QAQ我尽力了~~)

放张图理解一下:

class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> List[str]:
        wordDict = set(wordDict)
        mem = {}
        return self.helper(s, wordDict, mem)
        
    def helper(self, key, wordDict, mem):
        if key in mem:
            return mem[key]   #返回键值对 s: s.value
        
        value = []   #res是个临时变量,代表截至此处的可能的句子
        
        if not key:
            value.append("")
            return value      #最后从这儿出来
        
        for i in range(len(key)+1): 
            if key[:i] in wordDict: #若前尾巴是字典中的某个词
                sublist = self.helper(key[i:], wordDict, mem)
                for it in sublist:
                    value.append(key[:i] + ('' if not it else ' ') + it)  #这么写是因为可能遍历到很后面了,it为''   
                    
        mem[key] = value  #在mem中新添键值对 s:res
        
        return value

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值