leetcode题解:第139题Word Break

https://leetcode-cn.com/problems/word-break/

解法一、回溯

依照惯例,没有好的思路的时候,就先想想暴力解法怎么做。暴力解法无非是逐个单词地拆分字符串,每次选的单词可以重复。要实现暴力解法的话,肯定就是用回溯,因为回溯算法“撤销选择”的特点,保证了每次都能考虑到所有的单词。
简而言之,对于字符串s和单词word,word长度为n,当word与s[:n]相同时,就可以把word选来进行一次拆分,紧接着继续判断s[n:]是否能被拆分。当s被拆分到长度为0时,回溯算法就找到了答案。
回溯算法是一种穷举法,其时间复杂度自然就会比较高,要使其变得高效的话,采用剪枝是必需的。本题中我们如何剪枝呢?剪枝可以是剪掉那些一定不会得到解的分支,这我们在判断word == s[:n]时就进行了;剪枝也可以是剪掉重复的分支,我们尚未进行。考虑对于s = "leetcode"和单词leet, code, 'le', 'et',选用leet后会进行backtrack("code"),但当我们依次选用'le''et'后,又会进行backtrack("code"),这就存在了重复的分支(因为字典中的单词可以重复使用,即选择列表始终是相同的,只有要判断的s不同)。
要实现这种剪枝也容易,判断backtrack("s")是否被执行过即可。

代码
class Solution {
   
public:
    bool wordBreak(string s, vector<string>& wordDict) {
   
        unordered_set<string> set;
        backtrack(s, wordDict, set);
        return result;
    }
private:
    bool result = false;
    void backtrack(string
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值