最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)LeetCode(140.拆分詞句之二)

 更新時(shí)間:2021年07月28日 15:13:09   作者:Grandyang  
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(140.拆分詞句之二),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

[LeetCode] 140.Word Break II 拆分詞句之二

Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, add spaces in s to construct a sentence where each word is a valid dictionary word. Return all such possible sentences.

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 = "catsanddog" wordDict = ["cat", "cats", "and", "sand", "dog"] Output: [   "cats and dog",   "cat sand dog" ]

Example 2:

Input:
s = "pineapplepenapple"
wordDict = ["apple", "pen", "applepen", "pine", "pineapple"]
Output:
[
"pine apple pen apple",
"pineapple pen apple",
"pine applepen apple"
]
Explanation: Note that you are allowed to reuse a dictionary word.

Example 3:

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

這道題是之前那道Word Break 拆分詞句的拓展,那道題只讓我們判斷給定的字符串能否被拆分成字典中的詞,而這道題加大了難度,讓我們求出所有可以拆分成的情況,就像題目中給的例子所示。之前的版本中字典wordDict的數(shù)據(jù)類型是HashSet,現(xiàn)在的不知為何改成了數(shù)組vector,而且博主看到第二個(gè)例子就笑了,PPAP么,哈哈~

根據(jù)老夫行走江湖多年的經(jīng)驗(yàn),像這種返回結(jié)果要列舉所有情況的題,十有八九都是要用遞歸來(lái)做的。當(dāng)我們一時(shí)半會(huì)沒有啥思路的時(shí)候,先不要考慮代碼如何實(shí)現(xiàn),如果就給你一個(gè)s和wordDict,不看Output的內(nèi)容,你會(huì)怎么找出結(jié)果。比如對(duì)于例子1,博主可能會(huì)先掃一遍wordDict數(shù)組,看有沒有單詞可以當(dāng)s的開頭,那么我們可以發(fā)現(xiàn)cat和cats都可以,比如我們先選了cat,那么此時(shí)s就變成了 "sanddog",我們?cè)僭跀?shù)組里找單詞,發(fā)現(xiàn)了sand可以,最后剩一個(gè)dog,也在數(shù)組中,于是一個(gè)結(jié)果就出來(lái)了。然后回到開頭選cats的話,那么此時(shí)s就變成了 "anddog",我們?cè)僭跀?shù)組里找單詞,發(fā)現(xiàn)了and可以,最后剩一個(gè)dog,也在數(shù)組中,于是另一個(gè)結(jié)果也就出來(lái)了。那么這個(gè)查詢的方法很適合用遞歸來(lái)實(shí)現(xiàn),因?yàn)閟改變后,查詢的機(jī)制并不變,很適合調(diào)用遞歸函數(shù)。再者,我們要明確的是,如果不用記憶數(shù)組做減少重復(fù)計(jì)算的優(yōu)化,那么遞歸方法跟brute force沒什么區(qū)別,大概率無(wú)法通過OJ。所以我們要避免重復(fù)計(jì)算,如何避免呢,還是看上面的分析,如果當(dāng)s變成 "sanddog"的時(shí)候,那么此時(shí)我們知道其可以拆分成sand和dog,當(dāng)某個(gè)時(shí)候如果我們又遇到了這個(gè) "sanddog"的時(shí)候,我們難道還需要再調(diào)用遞歸算一遍嗎,當(dāng)然不希望啦,所以我們要將這個(gè)中間結(jié)果保存起來(lái),由于我們必須要同時(shí)保存s和其所有的拆分的字符串,那么可以使用一個(gè)HashMap,來(lái)建立二者之間的映射,那么在遞歸函數(shù)中,我們首先檢測(cè)當(dāng)前s是否已經(jīng)有映射,有的話直接返回即可,如果s為空了,我們?nèi)绾翁幚砟?,題目中說(shuō)了給定的s不會(huì)為空,但是我們遞歸函數(shù)處理時(shí)s是會(huì)變空的,這時(shí)候我們是直接返回空集嗎,這里有個(gè)小trick,我們其實(shí)放一個(gè)空字符串返回,為啥要這么做呢?我們觀察題目中的Output,發(fā)現(xiàn)單詞之間是有空格,而最后一個(gè)單詞后面沒有空格,所以這個(gè)空字符串就起到了標(biāo)記當(dāng)前單詞是最后一個(gè),那么我們就不要再加空格了。接著往下看,我們遍歷wordDict數(shù)組,如果某個(gè)單詞是s字符串中的開頭單詞的話,我們對(duì)后面部分調(diào)用遞歸函數(shù),將結(jié)果保存到rem中,然后遍歷里面的所有字符串,和當(dāng)前的單詞拼接起來(lái),這里就用到了我們前面說(shuō)的trick。for循環(huán)結(jié)束后,記得返回結(jié)果res之前建立其和s之間的映射,方便下次使用,參見代碼如下:

解法一:

class Solution {
public:
    vector<string> wordBreak(string s, vector<string>& wordDict) {
        unordered_map<string, vector<string>> m;
        return helper(s, wordDict, m);
    }
    vector<string> helper(string s, vector<string>& wordDict, unordered_map<string, vector<string>>& m) {
        if (m.count(s)) return m[s];
        if (s.empty()) return {""};
        vector<string> res;
        for (string word : wordDict) {
            if (s.substr(0, word.size()) != word) continue;
            vector<string> rem = helper(s.substr(word.size()), wordDict, m);
            for (string str : rem) {
                res.push_back(word + (str.empty() ? "" : " ") + str);
            }
        }
        return m[s] = res;
    }
};

我們也可以將將主函數(shù)本身當(dāng)作遞歸函數(shù),這樣就不用單獨(dú)的使用一個(gè)遞歸函數(shù)了,不過我們的HashMap必須是全局了,寫在外部就好了,參見代碼如下:

解法二:

class Solution {
public:
    unordered_map<string, vector<string>> m;
    vector<string> wordBreak(string s, vector<string>& wordDict) {
        if (m.count(s)) return m[s];
        if (s.empty()) return {""};
        vector<string> res;
        for (string word : wordDict) {
            if (s.substr(0, word.size()) != word) continue;
            vector<string> rem = wordBreak(s.substr(word.size()), wordDict);
            for (string str : rem) {
                res.push_back(word + (str.empty() ? "" : " ") + str);
            }
        }
        return m[s] = res;
    }
};

類似題目:

Word Break

Concatenated Words

參考資料:

https://leetcode.com/problems/word-break-ii/description/

https://leetcode.com/problems/word-break-ii/solution/

https://leetcode.com/problems/word-break-ii/discuss/44167/My-concise-JAVA-solution-based-on-memorized-DFS

到此這篇關(guān)于C++實(shí)現(xiàn)LeetCode(140.拆分詞句之二)的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)拆分詞句之二內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++簡(jiǎn)明分析臨時(shí)對(duì)象是什么

    C++簡(jiǎn)明分析臨時(shí)對(duì)象是什么

    對(duì)性能來(lái)說(shuō),許多的問題都需要和出現(xiàn)頻率及本身執(zhí)行一次的開銷掛鉤,有些問題雖然看似比較開銷較大,但是很少會(huì)執(zhí)行到,那也不會(huì)對(duì)程序有大的影響;同樣一個(gè)很小開銷的函數(shù)執(zhí)行很頻繁,同樣會(huì)對(duì)程序的執(zhí)行效率有很大影響。本章中作者主要根據(jù)臨時(shí)對(duì)象來(lái)闡述這樣一個(gè)觀點(diǎn)
    2022-04-04
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)與算法之圖的遍歷(二)

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)與算法之圖的遍歷(二)

    這篇文章主要是介紹了利用廣度優(yōu)先算法實(shí)現(xiàn)圖的遍歷,文中利用圖文詳細(xì)的介紹了實(shí)現(xiàn)步驟,對(duì)我們學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法有一定的幫助,需要的朋友可以參考一下
    2021-12-12
  • C++實(shí)現(xiàn)LeetCode(31.下一個(gè)排列)

    C++實(shí)現(xiàn)LeetCode(31.下一個(gè)排列)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(31.下一個(gè)排列),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++采用openfilename打開文件對(duì)話框用法實(shí)例

    C++采用openfilename打開文件對(duì)話框用法實(shí)例

    這篇文章主要介紹了C++采用openfilename打開文件對(duì)話框用法實(shí)例,是C++文件操作中非常實(shí)用的技巧,需要的朋友可以參考下
    2014-10-10
  • 詳細(xì)解讀C++編程中的匿名類類型和位域

    詳細(xì)解讀C++編程中的匿名類類型和位域

    這篇文章主要介紹了C++編程中的匿名類類型和位域,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2016-01-01
  • c++實(shí)現(xiàn)廣播通訊詳解

    c++實(shí)現(xiàn)廣播通訊詳解

    這篇文章主要為大家詳細(xì)介紹了c++實(shí)現(xiàn)廣播通訊的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下
    2024-12-12
  • C++入門之list的使用詳解

    C++入門之list的使用詳解

    這篇文章主要為大家介紹了C++入門之list的使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-11-11
  • C語(yǔ)言獲取文件大小的兩種方式

    C語(yǔ)言獲取文件大小的兩種方式

    因?yàn)橐粢曨l開發(fā)的需要,經(jīng)常會(huì)寫一些文件輸入輸出的測(cè)試程序,常常用到獲取文件大小的函數(shù),本篇文章就記錄一下常用的兩種獲取文件大小的方式,希望對(duì)大家有所幫助
    2023-11-11
  • php調(diào)用c++的方法

    php調(diào)用c++的方法

    這篇文章主要介紹了php調(diào)用c++的方法,需要的朋友可以參考下
    2014-01-01
  • C利用語(yǔ)言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)之隊(duì)列

    C利用語(yǔ)言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)之隊(duì)列

    隊(duì)列 (Queue):簡(jiǎn)稱隊(duì),是另一種限定性的線性表,它只允許在表的一端插入元素,而在另一端刪除元素。q=(a1, a2, a3, … an),其中a1為隊(duì)頭,an為隊(duì)尾,下面文章小編將為大家詳細(xì)介紹,需要的下伙伴可以參考一下
    2021-10-10

最新評(píng)論

兴宁市| 大名县| 若羌县| 永顺县| 中牟县| 江安县| 平度市| 安阳市| 淅川县| 启东市| 柳林县| 阜康市| 甘肃省| 辛集市| 兴文县| 卫辉市| 江都市| 城口县| 郸城县| 甘泉县| 望都县| 诸城市| 巩留县| 金湖县| 丹寨县| 额尔古纳市| 永州市| 临潭县| 萝北县| 通山县| 水富县| 奉节县| 蓬安县| 沙洋县| 临沂市| 临湘市| 固始县| 彩票| 荆州市| 建水县| 鹤峰县|