给定一个非空字符串 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;
};