Day46:代码随想录训练营第46天|139.单词拆分

文章讲解了如何通过动态规划方法解决LeetCode上的单词拆分问题,涉及dp数组定义、递推关系及遍历顺序的确定。
摘要由CSDN通过智能技术生成

139.单词拆分

题目链接:139. 单词拆分 - 力扣(LeetCode)

题解:

本题依旧使用动态规划法,使用动态规划五部曲

1.确定dp数组以及下标含义

dp[i]:字符串长度为i,dp[i]为true,即可以拆分为一个或多个在字典中出现的单词

2.确定递推公式

当dp[j]为true,那么在往后推导都会成立,所以dp[i]一定就是true

3.dp数组初始化

在递推公式中可以看出。dp[i]状态是依靠dp[j]是否为true,如果dp[0]表示字符串为空那么就是有空字符串,但题目说的条件是非空,所以排除这种情况

4.确定遍历顺序

题目中说可以拆分一个或多个在字典出现的单词,是一个完全背包

所以对于完全背包两层for循环本身顺序并不重要

如果求组合数就是外层for循环遍历物品,内层for遍历背包

如果求排列数就是外层for遍历背包,内层for循环遍历物品(强调顺序)

字符串的顺序并不能颠倒,讲究要有一定顺序,所以一定是求排列数即先遍历背包顺序,然后在遍历物品顺序

for  (int j = 0; j < wordDict.size(); j++) {//物品(非空字符串s)
    for (int i = wordDict[j].size(); i <= s.size(); i++) //背包 (非空单词列表)

5.打印dp数组验证递推公式正确

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
          unordered_set<string> wordSet(wordDict.begin(), wordDict.end());
          vector<bool> dp(s.size() + 1, flase);
          dp[0] = true;//dp数组初始化
//先遍历背包后遍历物品
          for(int i = 1; i <= s.size(); i++) {
             for (int j = 0; j < i; j++) {
                 string word = s.substr(j, i - j);//substr字符截取函数
                      if (wordSet.find(word) != wordSet.end() && dp[j]) {
                            dp[i] = true;
                            }
                        } 
                    }
           
        
retur dp[s.size()];









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值