c++怎么实现拆分词句

  介绍

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

拆分词句

a  non-empty  string  s ,和dictionary  wordDict ,包含一个列表of  non-empty ,话说,确定if  s ,可以划分为一个空格分隔的一系列> <李>

同一个词在字典里可能被重用多次分割。李李

<>

你可能认为词典不包含重复的单词。

示例1:

输入:s=發eetcode", wordDict=[“leet",“code"]
输出:真正的
解释:还真因为

“leetcode"

可以分割为

“民事法庭code"

示例2:

输入:s=癮pplepenapple", wordDict=[“apple",“pen"]
输出:真正的
解释:还真因为

,

applepenapple

,

可以分割为

,

苹果笔苹果

,

,,,,,,,请注意,您可以重用字典词。

示例3:

输入:s=癱atsandog", wordDict=[“cats",“dog",“sand",,这样,,“cat"]
输出:假

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

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

解法一:

class  Solution  {   公众:   ,,,bool  wordBreak (string 年代,vector,, wordDict), {   ,,,,,,,unordered_set, wordSet (wordDict.begin (),, wordDict.end ());   ,,,,,,,vector,备忘录(s.size (),, 1);   ,,,,,,,return 检查(年代,wordSet,, 0,,备忘录);   ,,,}   ,,,bool 检查(string 年代,unordered_set,, wordSet,, int 开始,vector,,备忘录),{   ,,,,,,,if  (start 祝辞=,s.size ()), return 真实;   ,,,,,,,if (备忘录[开始],!=,1),return 备忘录(开始);   ,,,,,,,for  (int 小姐:=,start  +, 1;,小姐:& lt;=, s.size ();, + + i), {   ,,,,,,,,,,,if  (wordSet.count (s.substr(开始,,小姐:今天早上,开始)),,,,检查(年代,wordSet,,我,,备忘录)),{   ,,,,,,,,,,,,,,,return 备忘录[开始],=,1;   ,,,,,,,,,,,}   ,,,,,,,}   ,,,,,,,return 备忘录[开始],=,0;   ,,,}   };

c++怎么实现拆分词句