题意给你一本单词,给你一句话,按规则替换句中的单词。
把在句中出现的单词,换成前缀在字典里面出现的字典序最小的那个单词,没有就不换。
字典里单词的个数是[1,1000],单词长度是[1,100]。
句子长度是[1,1000],句子里面的单词数[1,1000]。
很明显就是字典树,直接把字典的单词弄成字典树的形式,
然后再把句中的单词独立出来,在字典树中找,找到就替换,找不到就不变。
#define ALPHABET_SIZE 26
typedef struct trie_node
{
int count; // 记录该节点代表的单词的个数
trie_node *children[ALPHABET_SIZE]; // 各个子节点
}*trie;
trie_node* create_trie_node()
{
trie_node* pNode = new trie_node();
pNode->count = -1;
for (int i = 0; i<ALPHABET_SIZE; ++i)
pNode->children[i] = NULL;
return pNode;
}
void trie_insert(trie root, string str,int pos)
{
trie_node* now = root;
for(int i=0;i<str.size();i++)
{
if (now->children[str[i] - 'a'] == NULL)
{
now->children[str[i] - 'a'] = create_trie_node();
}
now = now->children[str[i] - 'a'];
}
now->count = pos;
}
int trie_find(trie root, string str)
{
trie_node* now = root;
for (int i = 0; i<str.size(); i++)
{
if (now->count != -1) return now->count;
if (now->children[str[i] - 'a'] == NULL)
return -1;
now = now->children[str[i] - 'a'];
}
return -1;
}
class Solution {
public:
string replaceWords(vector<string>& dict, string sentence) {
trie_node* root = create_trie_node();
string ans = "";
string temp = "";
for (int i = 0; i < dict.size(); i++)
trie_insert(root,dict[i],i);
int pos;
for (int i = 0; i < sentence.size(); i++)
{
if (sentence[i] == ' ' )
{
pos = trie_find(root,temp);
if (pos != -1)
ans += dict[pos] + " ";
else
ans += temp + " ";
temp = "";
}
else if (i == sentence.size()-1)
{
temp += sentence[i];
pos = trie_find(root, temp);
if (pos != -1)
ans += dict[pos];
else
ans += temp ;
}
else
{
temp += sentence[i];
}
}
return ans;
}
};
代码写的不好看,但是一次就过了,还打败了77%的玩家,还是一道很合理的medium。