代码随想录算法训练营第五十天| 139. 单词拆分

博客围绕Leetcode - 139题目展开,指出该题乍看难以判断是背包问题,实则是完全背包问题,因为字典中字符串可无限次使用,且需按固定顺序组装以满足目标串,属于排列问题。

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

Leetcode - 139

此题乍一看不知道是背包问题,但是如果用背包问题来做,这首先是一个完全背包,因为字典中的字符串可以无限次使用,其次,只有按固定顺序去组装才可能满足目标串,所以这是一个排列问题。

def wordBreak(self, s: str, wordDict: List[str]) -> bool:
#首先明确dp数组的含义,dp[i],代表字符串的第i个位置处,也就是0~i组成的子串是否能由字典中的字符串组成,所以类型是bool形
        dp = [False] * (len(s)+1)
#这里是为了后面的递归所设定的,dp[0]没有任何含义
        dp[0] = True

#由于是排列问题,所以背包作为外层循环
        for j in range(1,len(dp)):
#这里的设定是i小于等于j,如果dp[i]==True且i~j组成的子串也存在于字典中,那么0~j组成的子串肯定也能由字典中的串来构建,所以dp[j] == True. 此题比较灵活,这里商品的定义并不明确
            for i in range(j+1):
                subStr = s[i:j]
                if dp[i] == True and subStr in wordDict:
                    dp[j] = True
        
        return dp[-1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值