力扣 139. 单词拆分

这篇具有很好参考价值的文章主要介绍了力扣 139. 单词拆分。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、题目描述

给你一个字符串 s 和一个字符串列表 word_dict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s

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

示例 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

二、题解

通过回溯法进行暴力求解,时间复杂度 O ( n × 2 n ) O(n \times 2^n) O(n×2n),空间复杂度 O ( n ) O(n) O(n)

class Solution {
public:
    bool wordBreak(string s, vector<string> &word_dict) {
        unordered_set<string> word_set(word_dict.begin(), word_dict.end());

        return backtracking(s, word_set, 0);
    }

private:
    bool backtracking(string &s, unordered_set<string> &word_set, int begin_index) {
        if (begin_index == s.size()) {
            return true;
        }

        for (int i = begin_index; i < s.size(); i++) {
            string temp = s.substr(begin_index, i - begin_index + 1);
            if (word_set.find(temp) != word_set.end()) {
                /* temp在字典中存在 */
                if (backtracking(s, word_set, i + 1)) {
                    /* 拼接成功 */
                    return true;
                }
            }
        }

        return false;
    }
};

上述方法在递归的过程中有很多重复计算,可以使用数组保存一下递归过程中计算的结果,虽然时间复杂度和空间复杂度没有改变,但是进行了大量剪枝,从而实现了优化。

通过回溯法进行记忆化递归求解,时间复杂度 O ( n × 2 n ) O(n \times 2^n) O(n×2n),空间复杂度 O ( n ) O(n) O(n)

class Solution {
public:
    bool wordBreak(string s, vector<string> &word_dict) {
        unordered_set<string> word_set(word_dict.begin(), word_dict.end());
        vector<bool> valid_tag(s.size(), true); // true表示初始值,false表示从当前下标开始无法完成拼接

        return backtracking(s, word_set, valid_tag, 0);
    }

private:
    bool backtracking(string &s, unordered_set<string> &word_set, vector<bool> &valid_tag, int begin_index) {
        if (begin_index == s.size()) {
            return true;
        }

        /* 之前已经处理过从begin_index开始的拼接了,并且最终无法完成拼接 */
        if(!valid_tag.at(begin_index)) {
            return false;
        }

        for (int i = begin_index; i < s.size(); i++) {
            string temp = s.substr(begin_index, i - begin_index + 1);
            if (word_set.find(temp) != word_set.end()) {
                /* temp在字典中存在 */
                if (backtracking(s, word_set, valid_tag, i + 1)) {
                    /* 拼接成功 */
                    return true;
                }
            }
        }

        /* 从begin_index开始无法完成拼接 */
        valid_tag.at(begin_index) = false;

        return false;
    }
};

通过动态规划求解,由于二层循环里面对word_set的 find() 操作本质也是遍历,因此时间复杂度 O ( n 3 ) O(n^3) O(n3),空间复杂度 O ( n ) O(n) O(n)

class Solution {
public:
    bool wordBreak(string s, vector<string> &wordDict) {
        unordered_set<string> word_set(wordDict.begin(), wordDict.end());
        vector<bool> dp(s.size(), false); // dp[i]为true表示字符串s[0:i]可以被成功拼接

        /* 根据s.at(0)能否被拼接初始化动态规划数组 */
        if (word_set.find(s.substr(0, 1)) != word_set.end()) {
            dp.at(0) = true;
        }

        /* 从左向右递推 */
        for (int i = 1; i < s.size(); i++) {
            /* 如果s[0:i]本身就在字典中,直接continue */
            if (word_set.find(s.substr(0, i + 1)) != word_set.end()) {
                dp.at(i) = true;
                continue;
            }

            /* 依次判断s[0:j-1]和s[j:i]的状态 */
            for (int j = 1; j <= i; j++) {
                if (word_set.find(s.substr(j, i - j + 1)) != word_set.end() && dp.at(j - 1)) {
                    dp.at(i) = true;
                    continue;
                }
            }
        }

        return dp.at(dp.size() - 1);
    }
};

力扣 139. 单词拆分文章来源地址https://www.toymoban.com/news/detail-438541.html

到了这里,关于力扣 139. 单词拆分的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Leetcode 139.单词拆分

    OJ链接 :139.单词拆分  代码:    

    2024年02月04日
    浏览(31)
  • LeetCode 139. 单词拆分(动态规划,DFS和BFS解决)

    截止到目前我已经写了 600多道算法题 ,其中部分已经整理成了pdf文档, 目前 总共有1000多页 (并且还会不断的增加),大家可以免费下载 下载链接 :https://pan.baidu.com/s/1hjwK0ZeRxYGB8lIkbKuQgQ 提取码 :6666 上面代码有一个判断,就是截取的是前面全部字符串的时候要单独判断,

    2023年04月08日
    浏览(30)
  • 『力扣每日一题07』字符串最后一个单词的长度

    气死我啦,今天这道题花了快一个小时,我学完了答案的解法,放上去在线 OJ ,一直报错,找来找去都找不到自己错在哪,明明跟答案一模一样。后来还是学了另一种解法,才跑出来的(°̥̥̥̥̥̥̥̥o°̥̥̥̥̥̥̥̥)   后来我对比了两种写法,复盘了一下,应该是第一种解法

    2024年02月09日
    浏览(36)
  • 算法 DAY45 动态规划07 70. 爬楼梯 322. 零钱兑换 279. 完全平方数 139. 单词拆分 多重背包

    和377. 组合总和 Ⅳ (opens new window)基本就是一道题了。 本题代码不长,题目也很普通,但稍稍一进阶就可以考察完全背包 动态规划五部曲 1、确定dp[j]的含义 dp[j] 凑成 j 的最少硬币的个数 2、确定递推公式 比如想凑成3, 如果手里有1,那么最小个数就是dp[2]+1 如果手里有2,那

    2024年02月02日
    浏览(49)
  • 力扣hot100 单词拆分 变形背包 排列

    Problem: 139. 单词拆分 👨‍🏫 参考题解 时间复杂度: O ( n 3 ) O(n^3) O ( n 3 )

    2024年01月20日
    浏览(31)
  • 力扣labuladong一刷day63天单词拆分

    力扣labuladong一刷day63天单词拆分 一、139. 单词拆分 题目链接:https://leetcode.cn/problems/word-break/description/ 思路:s是否能被拆分成字典中的单词,单词数量是不限的,故是完全背包问题,不限数量的单词是否能组成字符串s,可以看的出来,并不是要求你长度相等就可以,还得有

    2024年01月21日
    浏览(28)
  • 解决背包衍生题目:单词拆分和分割等和子集--动态规划方式深度呈现

    目录 139. 单词拆分 解题思路 代码实现 416. 分割等和子集 二维动态规划 状态压缩(一维) 问题拓展 背包九讲知识总结 相关问题 题目描述 给你一个字符串  s  和一个字符串列表  wordDict  作为字典。请你判断是否可以利用字典中出现的单词拼接出  s  。 注意: 不要求字典中

    2024年02月03日
    浏览(36)
  • 【LeetCode动态规划#10】完全背包问题实战,其三(单词拆分,涉及集合处理字符串)

    力扣题目链接(opens new window) 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明: 拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 1: 输入: s = \\\"leetcode\\\", wordDict = [\\\"lee

    2023年04月20日
    浏览(45)
  • 力扣2788-按分隔符拆分字符串

    题目链接 解题思路: 1 .传参是一个字符串数组,我们需要对每一个字符串处理 2 .解题中e是字符串数组中的每一个字符串 3 .i是每个字符串的下标,n为每个字符串的大小 4 .遍历整个字符串 5 .start是要切割的位置

    2024年01月20日
    浏览(41)
  • 题目:1967.作为子字符串出现在单词中的字符串数组

    ​ 题目来源:         leetcode题目,网址:1967. 作为子字符串出现在单词中的字符串数目 - 力扣(LeetCode) 解题思路:         遍历字符串数组,根据 word.indexOf(pattern) 的返回值是否为 -1 判断改字符串是否为单词的字符串并对其计数即可。 解题代码: 总结:         官方

    2024年02月13日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包