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

C++實(shí)現(xiàn)LeetCode(648.替換單詞)

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

[LeetCode] 648.Replace Words 替換單詞

In English, we have a concept called root, which can be followed by some other words to form another longer word - let's call this word successor. For example, the root an, followed by other, which can form another word another.

Now, given a dictionary consisting of many roots and a sentence. You need to replace all the successor in the sentence with the root forming it. If a successor has many roots can form it, replace it with the root with the shortest length.

You need to output the sentence after the replacement.

Example 1:

Input: dict = ["cat", "bat", "rat"]
sentence = "the cattle was rattled by the battery"
Output: "the cat was rat by the bat"

Note:

  1. The input will only have lower-case letters.
  2. 1 <= dict words number <= 1000
  3. 1 <= sentence words number <= 1000
  4. 1 <= root length <= 100
  5. 1 <= sentence words length <= 1000

這道題給了我們一個(gè)前綴字典,又給了一個(gè)句子,讓我們將句子中較長(zhǎng)的單詞換成其前綴(如果在前綴字典中存在的話(huà))。我們對(duì)于句子中的一個(gè)長(zhǎng)單詞如何找前綴呢,是不是可以根據(jù)第一個(gè)字母來(lái)快速定位呢,比如cattle這個(gè)單詞的首字母是c,那么我們?cè)谇熬Y字典中找所有開(kāi)頭是c的前綴,為了方便查找,我們將首字母相同的前綴都放到同一個(gè)數(shù)組中,總共需要26個(gè)數(shù)組,所以我們可以定義一個(gè)二維數(shù)組來(lái)裝這些前綴。還有,我們希望短前綴在長(zhǎng)前綴的前面,因?yàn)轭}目中要求用最短的前綴來(lái)替換單詞,所以我們可以先按單詞的長(zhǎng)度來(lái)給所有的前綴排序,然后再依次加入對(duì)應(yīng)的數(shù)組中,這樣就可以保證短的前綴在前面。

下面我們就要來(lái)遍歷句子中的每一個(gè)單詞了,由于C++中沒(méi)有split函數(shù),所以我們就采用字符串流來(lái)提取每一個(gè)單詞,對(duì)于遍歷到的單詞,我們根據(jù)其首字母查找對(duì)應(yīng)數(shù)組中所有以該首字母開(kāi)始的前綴,然后直接用substr函數(shù)來(lái)提取單詞中和前綴長(zhǎng)度相同的子字符串來(lái)跟前綴比較,如果二者相等,說(shuō)明可以用前綴來(lái)替換單詞,然后break掉for循環(huán)。別忘了單詞之前還要加上空格,參見(jiàn)代碼如下:

解法一:

class Solution {
public:
    string replaceWords(vector<string>& dict, string sentence) {
        string res = "", t = "";
        vector<vector<string>> v(26);
        istringstream is(sentence);
        sort(dict.begin(), dict.end(), [](string &a, string &b) {return a.size() < b.size();});
        for (string word : dict) {
            v[word[0] - 'a'].push_back(word);
        }
        while (is >> t) {
            for (string word : v[t[0] - 'a']) {
                if (t.substr(0, word.size()) == word) {
                    t = word;
                    break;
                }
            }
            res += t + " ";
        }
        res.pop_back();
        return res;
    }
};

你以為想出了上面的解法,這道題就算做完了?? Naive! ! ! 這道題最好的解法其實(shí)是用前綴樹(shù)(Trie / Prefix Tree)來(lái)做,關(guān)于前綴樹(shù)使用之前有一道很好的入門(mén)題Implement Trie (Prefix Tree)。了解了前綴樹(shù)的原理機(jī)制,那么我們就可以發(fā)現(xiàn)這道題其實(shí)很適合前綴樹(shù)的特點(diǎn)。我們要做的就是把所有的前綴都放到前綴樹(shù)里面,而且在前綴的最后一個(gè)結(jié)點(diǎn)的地方將標(biāo)示isWord設(shè)為true,表示從根節(jié)點(diǎn)到當(dāng)前結(jié)點(diǎn)是一個(gè)前綴,然后我們?cè)诒闅v單詞中的每一個(gè)字母,我們都在前綴樹(shù)查找,如果當(dāng)前字母對(duì)應(yīng)的結(jié)點(diǎn)的表示isWord是true,我們就返回這個(gè)前綴,如果當(dāng)前字母對(duì)應(yīng)的結(jié)點(diǎn)在前綴樹(shù)中不存在,我們就返回原單詞,這樣就能完美的解決問(wèn)題了。所以啊,以后遇到了有關(guān)前綴或者類(lèi)似的問(wèn)題,一定不要忘了前綴樹(shù)這個(gè)神器喲~

解法二:

class Solution {
public:
    class TrieNode {
    public:
        bool isWord;
        TrieNode *child[26];
        TrieNode(): isWord(false) {
            for (auto &a : child) a = NULL;
        }
    };
    
    string replaceWords(vector<string>& dict, string sentence) {
        string res = "", t = "";
        istringstream is(sentence);
        TrieNode *root = new TrieNode();
        for (string word : dict) {
            insert(root, word);
        }
        while (is >> t) {
            if (!res.empty()) res += " ";
            res += findPrefix(root, t);
        }
        return res;
    }
    
    void insert(TrieNode* node, string word) {
        for (char c : word) {
            if (!node->child[c - 'a']) node->child[c - 'a'] = new TrieNode();
            node = node->child[c - 'a'];
        }
        node->isWord = true;
    }
    
    string findPrefix(TrieNode* node, string word) {
        string cur = "";
        for (char c : word) {
            if (!node->child[c - 'a']) break;
            cur.push_back(c);
            node = node->child[c - 'a'];
            if (node->isWord) return cur;
        }
        return word;
    }
};

類(lèi)似題目:

Implement Trie (Prefix Tree)

參考資料:

https://discuss.leetcode.com/topic/97203/trie-tree-concise-java-solution-easy-to-understand

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

相關(guān)文章

  • C++逐步介紹日期類(lèi)的使用

    C++逐步介紹日期類(lèi)的使用

    下面小編就為大家?guī)?lái)一篇C++實(shí)現(xiàn)日期類(lèi)(Date類(lèi))的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2022-07-07
  • C語(yǔ)言 常量,變量及數(shù)據(jù)詳細(xì)介紹

    C語(yǔ)言 常量,變量及數(shù)據(jù)詳細(xì)介紹

    這篇文章主要介紹了C語(yǔ)言 常量,變量及數(shù)據(jù)詳解的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • C語(yǔ)言中的柔性數(shù)組你真的了解嗎

    C語(yǔ)言中的柔性數(shù)組你真的了解嗎

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言中的柔性數(shù)組你,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • 淺析c/c++中函數(shù)的參數(shù)傳遞

    淺析c/c++中函數(shù)的參數(shù)傳遞

    c/c++中,函數(shù)可以傳遞的參數(shù)有三種形式,值、引用和指針。以下分別對(duì)這三種形式進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-07-07
  • 淺談關(guān)于C++memory_order的理解

    淺談關(guān)于C++memory_order的理解

    這篇文章主要介紹了淺談關(guān)于C++memory_order的理解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Qt實(shí)現(xiàn)鬧鐘小程序

    Qt實(shí)現(xiàn)鬧鐘小程序

    這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)鬧鐘小程序,利用Qt的designer設(shè)計(jì)需要的鬧鐘界面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • C++三體星戰(zhàn)小游戲源代碼

    C++三體星戰(zhàn)小游戲源代碼

    這篇文章主要給大家介紹了關(guān)于C++三體星戰(zhàn)小游戲的相關(guān)資料,文中給出了詳細(xì)完整的代碼示例,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • Linux編程實(shí)現(xiàn)制作文件的ed2k鏈

    Linux編程實(shí)現(xiàn)制作文件的ed2k鏈

    這篇文章主要介紹了Linux編程實(shí)現(xiàn)制作文件的ed2k鏈的相關(guān)資料,需要的朋友可以參考下
    2015-03-03
  • C語(yǔ)言中獲取進(jìn)程識(shí)別碼的相關(guān)函數(shù)

    C語(yǔ)言中獲取進(jìn)程識(shí)別碼的相關(guān)函數(shù)

    這篇文章主要介紹了C語(yǔ)言中獲取進(jìn)程識(shí)別碼的相關(guān)函數(shù),分別為getpid()函數(shù)和getppid()函數(shù)的使用,需要的朋友可以參考下
    2015-08-08
  • 詳解C++語(yǔ)言中的加法運(yùn)算符與賦值運(yùn)算符的用法

    詳解C++語(yǔ)言中的加法運(yùn)算符與賦值運(yùn)算符的用法

    這篇文章主要介紹了C++語(yǔ)言中的加法運(yùn)算符與賦值運(yùn)算符的用法,是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2016-01-01

最新評(píng)論

吉安县| 安丘市| 宽甸| 邵东县| 营口市| 浮梁县| 濉溪县| 北海市| 梁河县| 旌德县| 泗阳县| 浑源县| 松潘县| 濉溪县| 深水埗区| 镇江市| 洛浦县| 洮南市| 承德县| 禄劝| 梓潼县| 乌拉特前旗| 吉首市| 灯塔市| 夏津县| 四川省| 曲沃县| 依安县| 永康市| 景谷| 汉阴县| 萝北县| 辽阳县| 安国市| 兴隆县| 神木县| 个旧市| 渑池县| 厦门市| 龙江县| 类乌齐县|