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;
};