LeetCode 刷题 [C++] 第139题.单词拆分

文章讨论了如何使用动态规划方法解决一个字符串单词组合问题,即判断给定字符串s是否能由字典wordDict中的单词拼接而成,允许单词重复使用但不考虑顺序。通过构建dp数组,逐个检查子字符串与字典单词的匹配情况。

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

题目描述

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

注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
在这里插入图片描述

题目分析

背包问题特征
是否可以根据一个target,target可能是字符串或者数字,再给定一个容器,问:能否使用容器中的元素做各种排列组合得到 target。
完全背包问题解法

  • 如果是完全背包问题,即容器中的元素可重复使用并且不考虑元素之间顺序,容器放在外循环按序遍历,target在内循环,且内循环正序遍历。
  • 如果组合问题需考虑元素之间的顺序,需将 target 放在外循环,将容器放在内循环遍历,且内循环正序。

题目中描述的问题是一个最有组合问题,因此该问题可以使用背包的解题思路。

  • 物品:单词数组
  • 背包重量:字符串
  • 背包价值:单词是否组合成功字符串

由于每个字符串都需所有的单词组合一遍,因此将字符串的循环放到单词数组的循环之前。

  1. dp[i] 表示以第 i 个字符结尾的字符串是否可以被 wordDict 中组合而成;
    • 外层遍历s中每一个与word同长度的字串s.substr(i - len, len) ;
    • 内层遍历wordDict每个word。
  2. 判断 s.substr(i - len, len) == word:
    • 若不相等,说明与该 word 不匹配,继续遍历;
    • 若相等,说明从 [i - len] 到 i 的字符与 word 匹配。
  3. dp[i] = dp[i - len] && !s.substr(i - len, len).compare(wordDict[j])
  4. 对于边界条件,我们定义 dp[0] = true 表示空串且合法。
  5. 最后返回 dp[s.size()]

Code

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        vector<bool> dp(s.size() + 1, false);
        dp[0] = true;
        int len = 0;
        for(int i = 1; i <= dp.size(); ++i){
            for(int j = 0; j < wordDict.size(); ++j){
                int len = wordDict[j].length();
                if(i >= len) {
                    dp[i] = dp[i - len] && !s.substr(i - len, len).compare(wordDict[j]);
                    if (dp[i]) break;
                }
            }
        }
        return dp[s.size()];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值