|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 糖逗 于 2021-1-26 10:33 编辑
题目描述:
- 在英语中,我们有一个叫做 词根(root)的概念,它可以跟着其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor)。例如,词根an,跟随着单词 other(其他),可以形成新的单词 another(另一个)。
- 现在,给定一个由许多词根组成的词典和一个句子。你需要将句子中的所有继承词用词根替换掉。如果继承词有许多可以形成它的词根,则用最短的词根替换它。
- 你需要输出替换之后的句子。
-  
- 示例 1:
- 输入:dictionary = ["cat","bat","rat"], sentence = "the cattle was rattled by the battery"
- 输出:"the cat was rat by the bat"
- 示例 2:
- 输入:dictionary = ["a","b","c"], sentence = "aadsfasf absbs bbab cadsfafs"
- 输出:"a a b c"
- 示例 3:
- 输入:dictionary = ["a", "aa", "aaa", "aaaa"], sentence = "a aa a aaaa aaa aaa aaa aaaaaa bbb baba ababa"
- 输出:"a a a a a a a a bbb baba a"
- 示例 4:
- 输入:dictionary = ["catt","cat","bat","rat"], sentence = "the cattle was rattled by the battery"
- 输出:"the cat was rat by the bat"
- 示例 5:
- 输入:dictionary = ["ac","ab"], sentence = "it is abnormal that this solution is accepted"
- 输出:"it is ab that this solution is ac"
-  
- 提示:
- 1 <= dictionary.length <= 1000
- 1 <= dictionary[i].length <= 100
- dictionary[i] 仅由小写字母组成。
- 1 <= sentence.length <= 10^6
- sentence 仅由小写字母和空格组成。
- sentence 中单词的总量在范围 [1, 1000] 内。
- sentence 中每个单词的长度在范围 [1, 1000] 内。
- sentence 中单词之间由一个空格隔开。
- sentence 没有前导或尾随空格。
- 来源:力扣(LeetCode)
- 链接:https://leetcode-cn.com/problems/replace-words
- 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码
- class Solution {
- public:
- //字典树的结构
- struct TrieTree{
- bool flag;
- map<char, TrieTree*> next;
- TrieTree(): flag(false){};
- };
- string replaceWords(vector<string>& dictionary, string sentence) {
- //构建前缀树
- //先建立根节点
- TrieTree* root = new TrieTree();
- for(auto word : dictionary){
- TrieTree* node = root;//从根节点开始搜索
- for(auto cha : word){
- if((node -> next).count(cha) == 0){
- node -> next[cha] = new TrieTree();
- }
- node = node -> next[cha];
- }
- node -> flag = true;
- }
- //搜索前缀返回结果
- string res;
- int start = 0, end = 0;
- int len = sentence.size();
- for(int i = 0; i < len; i++){
- start = i;
- TrieTree* node = root;//从根节点开始找
- while(i < len && sentence[i] != ' '){
- if(node -> flag == true || (node -> next).count(sentence[i]) == 0)break;
- node = node -> next[sentence[i]];
- i++;
- }
- if(node -> flag == true){
- //找到了
- end = i;
- //定位到下一个start的位置
- while(i < len && sentence[i] != ' ')i++;
- }else if((node -> next).count(sentence[i]) == 0){
- //没找到
- //定位到下一个start的位置
- while(i < len && sentence[i] != ' ')i++;
- end = i;
- }
- res += " " + sentence.substr(start, end - start);
- }
- res.erase(res.begin());
- return res;
- }
- };
复制代码 |
|