1. 程式人生 > >Leetcode------139. 單詞拆分

Leetcode------139. 單詞拆分

給定一個非空字串 s 和一個包含非空單詞列表的字典 wordDict,判定 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

 

 

-------------------------------------------------------------------------------------------------------------------------------------------

單詞組合問題,可以用字典樹寫,最近剛剛瞭解了字典樹,字典樹可真是個好東西。

  字典樹對於字元的查詢確實很好,而且寫起來也不難。

AC:

struct TrieNode
    {
        bool isword;    //作用是用於標記一個單詞的結尾,有點像連結串列的封尾。
        TrieNode* child[26];     //代表26字母。
        TrieNode()
        {
               isword=false;
               memset(child,NULL,sizeof(child));
        }
    };
class Trie {
public:
    /** Initialize your data structure here. */

    Trie() {
         root=new TrieNode();
    }
    
    /** Inserts a word into the trie. */
    void insert(string word) {
        TrieNode *r=root;
        for (int i=0;i<word.length();i++)
        {
            if (r->child[word[i]-'a']==NULL)
            {
                r->child[word[i]-'a']=new TrieNode();
            }
            r=r->child[word[i]-'a'];
        }
        r->isword=true;
    }
    
    /** Returns if the word is in the trie. */
    bool search(string word) {
        TrieNode* r=root;
        for (int i=0;i<word.length();i++)
        {
            if (r->child[word[i]-'a']==NULL)
            {
                return false;
            }
             r=r->child[word[i]-'a'];
        }
        return (r->isword);
    }
    
    /** Returns if there is any word in the trie that starts with the given prefix. */
    bool startsWith(string prefix) {
        TrieNode* r=root;
        for (int i=0;i<prefix.length();i++)
        {
            if (r->child[prefix[i]-'a']==NULL)
            {
                return false;
            }
             r=r->child[prefix[i]-'a'];
        }
        return true;
    }
    private:
    TrieNode* root;
};