代码随想录刷题第46天

本文介绍了如何使用动态规划方法解决LeetCode中的WordBreak问题,将字符串看作背包,通过遍历字典中的单词和子字符串来确定字符串是否可由字典中的单词拆分。
摘要由CSDN通过智能技术生成

第一题是单词拆分https://leetcode.cn/problems/word-break/,不妨将单词看作一个个物品,字符串看作需要装满的背包,由于能够重复使用字典中的单词,所以这是一道完全背包问题。dp[i]为true时表示长度为i的字符可以被字典中的单词拆分。当dp[j]为true时,遍历发现串[j, i]在字典中,则dp[i]一定为true。初始化dp[0]为true,其余dp数组值初始化为false。由于本题中字典单词的排列会影响字符串的组成,因此可视作求排列数,先遍历背包,再遍历物品。

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        unordered_set<string> wordSet(wordDict.begin(), wordDict.end());
        vector<bool> dp(s.size() + 1,false);
        dp[0] = true;
        for (int i = 1; i <= s.size(); i++){
            for (int j = 0; j < i; j++){
                string word = s.substr(j, i - j);
                if (wordSet.find(word) != wordSet.end() && dp[j])
                dp[i] = true;
            }
        }
        return dp[s.size()];

    }
};

完成背包问题,爽😊

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值