稀碎从零算法笔记Day29-LeetCode:单词拆分

死磕dp的第二天了

题型:dp,字符串,二维数组,背包类

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

来源:LeetCode

题目描述

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true

注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。

题目样例

代码

测试用例

测试用例

测试结果

139. 单词拆分

已解答

中等

相关标签

相关企业

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true

注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。

示例 1:

输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。

示例 2:

输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以由 "apple" "pen" "apple" 拼接成。
     注意,你可以重复使用字典中的单词。

示例 3:

输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false

提示:

  • 1 <= s.length <= 300
  • 1 <= wordDict.length <= 1000
  • 1 <= wordDict[i].length <= 20
  • s 和 wordDict[i] 仅由小写英文字母组成
  • wordDict 中的所有字符串 互不相同

题目思路

纯看题解做的。

一开始笔者思路是遍历并且找到字典中的一个串,就修改原串。很显然错了(感觉这个思路+回溯的话应该对了)

然后看卡尔的讲解:她这边推荐照着背包来理解:将题目转化为 “字典能否凑齐目标串”——目标串当成背包,字典中的串自然是“宝石”,串长就是“宝石”的重量。这样就转化为一个完全背包的问题

确定要走dp后,然后就是老生常谈的dp[i]的含义:因为只要确认能否凑出来,dp[i]那就是“长度”为 i 的串在字典中能否凑出来?同时我们不能【顾头不顾腚】—— j 和 i这一块的字符串也得看一下字典中有没有

于是dp[i] = dp[j]&(substr(j,i-j)!=std::find(wd.begin(),wd.end(),str))//当然,这一步创一个无序集合,可读性会更好些

笔者感觉不好理解的点是substr截取的长度是 【i-j】而不 +1 ,笔者感觉和 i 从1开始走有关

C++代码

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        // 老实dp
        int slen = s.length(),wdnum = wordDict.size();
        // dp[i]的含义:长度为i的字符串,能否找到字典中的单词
        //dp[i] :要看 ①dp[j] = 1(j是i前面的指针),说明前j个位置能从字典中查到 ②[j,i]的字符串在字典中有
        vector<bool> dp(slen + 1 , 0);
        dp[0] = 1;
        for(int i=1;i< slen+1;i++)
        {
            for(int j=0;j<i;j++)
            {
                // 长度是i-j,因为
                string temp = s.substr(j,i-j);
                if(dp[j] == 1 && std::find(wordDict.begin(),wordDict.end(),temp)!= wordDict.end())
                    dp[i] = 1;
            }
        }
        return dp[slen];
    }
};

结算页面

还得继续沉淀下

相关推荐

  1. 算法笔记Day40-LeetCode:加油站

    2024-03-27 09:34:04       41 阅读
  2. 算法笔记Day24-LeetCode:存在重复元素

    2024-03-27 09:34:04       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-27 09:34:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-27 09:34:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-27 09:34:04       87 阅读
  4. Python语言-面向对象

    2024-03-27 09:34:04       96 阅读

热门阅读

  1. leetcode 1218.最长定差子序列

    2024-03-27 09:34:04       39 阅读
  2. 了解什么是Docker

    2024-03-27 09:34:04       39 阅读
  3. React常见跳转方式汇总

    2024-03-27 09:34:04       42 阅读
  4. 特征提取技术实例

    2024-03-27 09:34:04       40 阅读
  5. 【计算机网络教程】(第六版)第2章课后习题答案

    2024-03-27 09:34:04       40 阅读
  6. Chrome安装Vue插件vue-devtools

    2024-03-27 09:34:04       49 阅读
  7. STM32 RC522智能门锁

    2024-03-27 09:34:04       43 阅读
  8. ref 解包细节

    2024-03-27 09:34:04       41 阅读
  9. VUE3——Proxy API 与VUE2——defineProperty API区别

    2024-03-27 09:34:04       39 阅读
  10. ubuntu开启ssh服务

    2024-03-27 09:34:04       40 阅读