iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++怎么实现拆分词句
  • 410
分享到

C++怎么实现拆分词句

2023-06-20 16:06:20 410人浏览 泡泡鱼
摘要

这篇文章主要讲解了“c++怎么实现拆分词句”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++怎么实现拆分词句”吧!拆分词句Given a non-empty strin

这篇文章主要讲解了“c++怎么实现拆分词句”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++怎么实现拆分词句”吧!

拆分词句

Given a non-empty string s and a dictionary WordDict containing a list of non-empty words, determine if s can be segmented into a space-separated sequence of one or more dictionary words.

Note:

  • The same word in the dictionary may be reused multiple times in the segmentation.

  • You may assume the dictionary does not contain duplicate words.

Example 1:

Input: s = "LeetCode", wordDict = ["leet", "code"]
Output: true
Explanation: Return true because

"leetcode"

can be segmented as

"leet code"

.

Example 2:

Input: s = "applepenapple", wordDict = ["apple", "pen"]
Output: true
Explanation: Return true because

"

applepenapple

"

can be segmented as

"

apple pen apple

"

.

             Note that you are allowed to reuse a dictionary word.

Example 3:

Input: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
Output: false

这道拆分词句问题是看给定的词句能分被拆分成字典里面的内容,这是一道很经典的题目,解法不止一种,考察的范围很广,属于我们必须要熟练掌握的题目。那么先来想 brute force 的解法,就拿例子1来分析,如果字典中只有两个单词,我们怎么去判断,是不是可以将原字符串s分成任意两段,然后再看分成的单词是否在字典中。注意这道题说是单词可以重复使用,所以可以分成任意段,而且字典中的单词可以有很多个,这就增加了题目的难度,很多童鞋就在这里迷失了,毫无头绪。

既然要分段,看子字符串是否在字典中,由于给定的字典是数组(之前还是 HashSet 呢),那么我们肯定不希望每次查找都需要遍历一遍数组,费劲!还是把字典中的所有单词都存入 HashSet 中吧,这样我们就有了常数时间级的查找速度,perfect!好,我们得开始给字符串分段了,怎么分,只能一个一个分了,先看第一个字母是否在字典中,如果不在的话,好办,说明这种分法肯定是错的。问题是在的话,后面的那部分怎么处理,难道还用 for 循环?咱也不知道还要分多少段,怎么用 for 循环。对于这种不知道怎么处理的情况,一个万能的做法是丢给递归函数,让其去递归求解,这里我们 suppose 递归函数会返回我们一个正确的值,如果返回的是 true 的话,表明我们现在分成的两段都在字典中,我们直接返回 true 即可,因为只要找出一种情况就行了。这种调用递归函数的方法就是 brute force 的解法,我们遍历了所有的情况,优点是写法简洁,思路清晰,缺点是存在大量的重复计算,被 OJ 啪啪打脸。所以我们需要进行优化,使用记忆数组 memo 来保存所有已经计算过的结果,再下次遇到的时候,直接从 cache 中取,而不是再次计算一遍。这种使用记忆数组 memo 的递归写法,和使用 dp 数组的迭代写法,乃解题的两大神器,凡事能用 dp 解的题,一般也有用记忆数组的递归解法,好似一对形影不离的好基友~关于 dp 解法,博主会在下文中讲解。这里我们的记忆数组 memo[i] 定义为范围为 [i, n] 的子字符串是否可以拆分,初始化为 -1,表示没有计算过,如果可以拆分,则赋值为1,反之为0。在之前讲 brute force 解法时,博主提到的是讲分成两段的后半段的调用递归函数,我们也可以不取出子字符串,而是用一个 start 变量,来标记分段的位置,这样递归函数中只需要从 start 的位置往后遍历即可,在递归函数更新记忆数组 memo 即可,参见代码如下:

解法一:

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

这道题其实还是一道经典的 DP 题目,也就是动态规划 Dynamic Programming。博主曾经说玩子数组或者子字符串且求极值的题,基本就是 DP 没差了,虽然这道题没有求极值,但是玩子字符串也符合 DP 的状态转移的特点。把一个人的温暖转移到另一个人的胸膛... 咳咳,跑错片场了,那是爱情转移~ 强行拉回,DP 解法的两大难点,定义 dp 数组跟找出状态转移方程,先来看 dp 数组的定义,这里我们就用一个一维的 dp 数组,其中 dp[i] 表示范围 [0, i) 内的子串是否可以拆分,注意这里 dp 数组的长度比s串的长度大1,是因为我们要 handle 空串的情况,我们初始化 dp[0] 为 true,然后开始遍历。注意这里我们需要两个 for 循环来遍历,因为此时已经没有递归函数了,所以我们必须要遍历所有的子串,我们用j把 [0, i) 范围内的子串分为了两部分,[0, j) 和 [j, i),其中范围 [0, j) 就是 dp[j],范围 [j, i) 就是 s.substr(j, i-j),其中 dp[j] 是之前的状态,我们已经算出来了,可以直接取,只需要在字典中查找 s.substr(j, i-j) 是否存在了,如果二者均为 true,将 dp[i] 赋为 true,并且 break 掉,此时就不需要再用j去分 [0, i) 范围了,因为 [0, i) 范围已经可以拆分了。最终我们返回 dp 数组的最后一个值,就是整个数组是否可以拆分的布尔值了,代码如下:

解法二:

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

下面我们从题目中给的例子来分析:

le e 

lee ee e 

leet 

leetc eetc etc tc c 

leetco eetco etco tco co o 

leetcod eetcod etcod tcod cod od d 

leetcode eetcode etcode tcode code 

T F F F T F F F T 

我们知道算法的核心思想是逐行扫描,每一行再逐个字符扫描,每次都在组合出一个新的字符串都要到字典里去找,如果有的话,则跳过此行,继续扫描下一行。

既然 DFS 都可以解题,那么 BFS 也就坐不住了,也要出来蹦跶一下。其实本质跟递归的解法没有太大的区别,递归解法在调用递归的时候,原先的状态被存入了栈中,这里 BFS 是存入了队列中,使用 visited 数组来标记已经算过的位置,作用跟 memo 数组一样,从队列中取出一个位置进行遍历,把可以拆分的新位置存入队列中,遍历完成后标记当前位置,然后再到队列中去取即可,参见代码如下:

解法三:

class Solution {public:    bool wordBreak(string s, vector<string>& wordDict) {        unordered_set<string> wordSet(wordDict.begin(), wordDict.end());        vector<bool> visited(s.size());        queue<int> q{{0}};        while (!q.empty()) {            int start = q.front(); q.pop();            if (!visited[start]) {                for (int i = start + 1; i <= s.size(); ++i) {                    if (wordSet.count(s.substr(start, i - start))) {                        q.push(i);                        if (i == s.size()) return true;                    }                }                visited[start] = true;            }        }        return false;    }};

感谢各位的阅读,以上就是“C++怎么实现拆分词句”的内容了,经过本文的学习后,相信大家对C++怎么实现拆分词句这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: C++怎么实现拆分词句

本文链接: https://www.lsjlt.com/news/298450.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++怎么实现拆分词句
    这篇文章主要讲解了“C++怎么实现拆分词句”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++怎么实现拆分词句”吧!拆分词句Given a non-empty strin...
    99+
    2023-06-20
  • C++实现LeetCode(139.拆分词句)
    [LeetCode] 139. Word Break 拆分词句 Given a non-empty string s and a dictio...
    99+
    2022-11-12
  • C++实现LeetCode(140.拆分词句之二)
    [LeetCode] 140.Word Break II 拆分词句之二 Given a non-empty string s and a di...
    99+
    2022-11-12
  • C++中怎么利用LeetCode拆分词
    这期内容当中小编将会给大家带来有关C++中怎么利用LeetCode拆分词,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。[LeetCode] 140.Word Break II 拆分词句之二Given a&...
    99+
    2023-06-20
  • Verilog关键词的多分支语句怎么实现
    今天小编给大家分享一下Verilog关键词的多分支语句怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。关键词:case...
    99+
    2023-07-06
  • C++实现LeetCode(131.拆分回文串)
    [LeetCode] 131.Palindrome Partitioning 拆分回文串 Given a string s, partition s s...
    99+
    2022-11-12
  • C++怎么实现群组错位词
    本篇内容介绍了“C++怎么实现群组错位词”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! Group Anagrams 群组错位词G...
    99+
    2023-06-20
  • C++实现LeetCode(132.拆分回文串之二)
    [LeetCode] 132.Palindrome Partitioning II 拆分回文串之二 Given a string s, partition s&#...
    99+
    2022-11-12
  • HanLP分词器HanLPTokenizer怎么实现
    HanLP分词器HanLPTokenizer怎么实现,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。anlp在功能上的扩展主要体现在以下几个方面:•关键词提取 •自...
    99+
    2023-06-02
  • mysql数据水平拆分怎么实现
    MySQL的数据水平拆分可以通过以下几种方式来实现: 分区(Partitioning):MySQL支持分区表,可以将表的数据按照...
    99+
    2023-10-27
    mysql
  • c语言怎么实现单词搜索
    本文小编为大家详细介绍“c语言怎么实现单词搜索”,内容详细,步骤清晰,细节处理妥当,希望这篇“c语言怎么实现单词搜索”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。单词搜索给定一个 m x n 二维字符网格 boa...
    99+
    2023-06-30
  • 使用Pinyin4j怎么实现拼音分词
    使用Pinyin4j怎么实现拼音分词?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。使用maven引入相关的jar<dependency> ...
    99+
    2023-05-30
  • ​ElasticSearch怎么实现分词全文检索
    Elasticsearch是一个基于Lucene的搜索引擎,它提供了强大的全文搜索和分析能力。要实现分词全文检索,你可以按照以下步骤...
    99+
    2023-10-21
    ​ElasticSearch
  • Django项目配置怎么实现拆分独立
    本篇内容介绍了“Django项目配置怎么实现拆分独立”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Django 项目中,我们默认的配置是都在...
    99+
    2023-06-25
  • C++怎么实现求末尾单词的长度
    本篇内容介绍了“C++怎么实现求末尾单词的长度”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!求末尾单词的长度Given a string&n...
    99+
    2023-06-20
  • C#实现拆分合并Word表格中的单元格
    目录程序环境在Word表格中合并单元格完整代码效果图在Word表格中拆分单元格完整代码效果图我们在使用Word制作表格时,由于表格较为复杂,只是简单的插入行、列并不能满足我们的需要。...
    99+
    2022-12-22
    C#拆分合并Word表格单元格 C#拆分单元格 C#合并单元格
  • C++实现LeetCode之替换单词的示例分析
    这篇文章主要介绍C++实现LeetCode之替换单词的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完![LeetCode] 648.Replace Words 替换单词In English, we have a...
    99+
    2023-06-20
  • Python怎么实现Excel拆分并自动发邮件
    本篇内容介绍了“Python怎么实现Excel拆分并自动发邮件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!需求需要向大约 500 名用户发...
    99+
    2023-07-06
  • Hive中怎么利用UDF实现文本分词
    Hive中怎么利用UDF实现文本分词,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。UDF 简介Hive作为一个sql查询引擎,自带了一些基本的...
    99+
    2022-10-18
  • 怎么用php语句实现分页
    在使用PHP语句实现分页时,可以按照以下步骤进行操作:1. 获取当前页码:通过URL中传递的参数或者其他方式获取当前页码。2. 设置...
    99+
    2023-08-29
    PHP
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作