In English, we have a concept called root, which can be followed by some other words to form another longer word - let’s call this word successor. For example, the root an, followed by other, which can form another word another.
Now, given a dictionary consisting of many roots and a sentence. You need to replace all the successor in the sentence with the root forming it. If a successor has many roots can form it, replace it with the root with the shortest length.
You need to output the sentence after the replacement.
Example 1:
Input: dict = [“cat”, “bat”, “rat”]
sentence = “the cattle was rattled by the battery”
Output: “the cat was rat by the bat”
Note:
The input will only have lower-case letters.
1 <= dict words number <= 1000
1 <= sentence words number <= 1000
1 <= root length <= 100
1 <= sentence words length <= 1000
本题题意很简单,就是寻找前缀然后做替换,这道题的本意使用公共前缀树来说,但是这里就不这么麻烦了,直接去做即可,为了加速搜索,这里按照首字母做了26个分类,然后做了一个排序,最后暴力搜索即可
注意这里使用26个字幕做一个出事的分类,这个会加速计算
代码如下:
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <string>
#include <climits>
#include <algorithm>
#include <sstream>
#include <functional>
#include <bitset>
#include <numeric>
#include <cmath>
#include <regex>
using namespace std;
bool cmp(string a, string b)
{
return a.length() < b.length();
}
class Solution
{
public:
string replaceWords(vector<string>& dictory, string sentence)
{
sort(dictory.begin(), dictory.end(), cmp);
vector<vector<string>> dict(26);
for (string s : dictory)
dict[s[0] - 'a'].push_back(s);
stringstream ss(sentence);
string res = "",one = "";
while (ss >> one)
{
for (string t : dict[one[0] - 'a'])
{
if (one.substr(0, t.length()) == t)
{
one = t;
break;
}
}
res += one + " ";
}
res.pop_back();
return res;
}
};