【leetcode】139. Word Break

这篇博客介绍了如何利用动态规划解决LeetCode中的139题——Word Break问题。博主首先尝试了递归的DFS方法,但因超时而失败。接着,博主学习了一种优化方案,改用一维数组dp,从两端分别进行计算,通过检查子串是否在wordDict中来更新dp状态。特殊情况包括空字符串和空字典,直接返回false。博客提供了超时代码和两种正确的一维数组dp实现方式,并引用了相关讨论。
摘要由CSDN通过智能技术生成

题目:
在这里插入图片描述


思路:
动态规划。用二维数组dp[i][j]保存s[i~j]是否在wordDict。然后用递归的方式进行DFS深度优先遍历,将所有可能的组合都尝试一遍。但是超时了,结果为29 / 36 test cases passed

然后学习了https://www.cnblogs.com/reboot329/p/6168346.html之后,发现用一维数组dp(数组大小与字符串长度相同)就可以解决,dp[i]代表s[i+1]及其之后的元素都能匹配成功。我是倒着往前算的,从dp的最后一个元素开始。如果s[i~j]成功匹配,并且dp[j]为true(s[j+1]及其之后的元素可以匹配成功),则dp[i-1]置为true。否则,什么都不用做。继续向前寻找dp为true的元素,重复前述过程。

特殊情况:s为空或wordDict为空,直接返回false即可。

正着算的思路是一样的,只是实现细节不一样而已。


代码实现:

超时的代码:

class Solution {
   
public:
    
    bool existInSet(string &s, unordered_set<string> &sset){
   
        if (sset.find(s) != sset.end()){
   
            return true;
        }
        return false;
    }
    
    bool f(const string &s, const vector<vector<bool>> &dp, int begin){
   
        if (begin >= s.size()){
   
            return true;
        }
        
        for (int i = s.size()-1; i >= begin; --i) {
   
            if (dp[begin][i] == true) {
   
                bool ret = f(s, dp, i + 1);
                if (ret == true) {
   
                    return ret;
                }
            }
        }
        
        return false;
    }
    
    bool wordBreak(string s, vector<string>& wordDict) {
   
        unordered_set<string> sset;
        int nums = wordDict.size();
        for (int i 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值