题目描述
在给定单词列表wordlist的情况下,我们希望实现一个拼写检查器,将查询单词转换为正确的单词。对于给定的查询单词query,拼写检测器将会处理两类拼写错误:
- 大小
- 写:如果查询匹配单词拼写列表中的某个单词(不区分大小写),则返回的正确单词与单词列表中的大小写相同。
- 例如:wordlist = ["yellow"],query = "YellOw";correct = "yellow"
- 例如:wordlist = ["Yellow"],query = "yellow";correct = "Yellow"
- 例如:wordlist = ["yellow"],query = "yellow";correct = "yellow"
- 元音错误:如果在将查询单词中的元音('a','e','i','o','u')分别替换为任何元音后,能与单词列表中的单词匹配(不区分大小写),则返回的正确单词与单词列表中的匹配项大小写相同。
- 例如:wordlist = ["YellOw"],query = "yellow";correct = "YellOw"
- 例如:wordlist = ["YellOw"],query = "yeellow";correct = ""(无匹配项)
- 例如:wordlist = ["YellOw"],query = "yllw";correct = ""(无匹配项)
此外,拼写检查器还按照以下优先级规则操作:
- 当查询完全匹配单词列表中的某个单词(区分大小写)时,应返回相同的单词
- 当查询匹配到大小写问题的单词时,您应该返回单词列表中的第一个这样的匹配项
- 当查询匹配到元音错误的单词时,您应该返回单词列表中的第一个这样的匹配项
- 如果该查询在单词列表中没有匹配项,则应返回空字符串
给出一些查询queries,返回一个正确单词答案列表answer,其中anwser[i]是由查询query = queries[i]得到的正确单词。
示例1
输入:wordlist = ["KiTe","kite","hare","Hare"],queries = ["kite","Kite","KiTe","Hare","HARE","Hear","hear","keti","keet","keto"]
输出:["kite","KiTe","KiTe","Hare","hare","","","KiTe","","KiTe"]
解题思路
根据检测器优先级规则,完全正确(区分大小写)->忽略大小写->元音错误(不区分大小写)->没有匹配项,设置三个vector分别保存原始wordlist,全部转换成小写单词,将每一个单词的元音替换成'_',然后依次查询。
vector<string> vec_best;
vector<string> vec_ignore;
vector<string> vec_del;
string to_lower(string str){
string res = "";
for(int i=0;i<str.length();i++) res += tolower(str[i]);
return res;
}
string del(string str){
string res = "";
for(int i=0;i<str.length();i++){
char c = tolower(str[i]);
if(c != 'a' && c != 'e' && c != 'i' && c != 'o' && c != 'u') res += str[i];
else res += '_';
}
return res;
}
vector<string> spellchecker(vector<string>& wordlist, vector<string>& queries) {
vector<string> ans;
vector<string>::iterator it;
int idx = 0,len;
len = wordlist.size();
for(int i=0;i<len;i++){
vec_best.push_back(wordlist[i]);
vec_ignore.push_back(to_lower(wordlist[i]));
vec_del.push_back(to_lower(del(wordlist[i])));
}
len = queries.size();
for(int i=0;i<len;i++){
string s = queries[i];
it = find(vec_best.begin(),vec_best.end(),s);
idx = it - vec_best.begin();
if(it == vec_best.end()){
it =
(vec_ignore.begin(),vec_ignore.end(),to_lower(s));
idx = it - vec_ignore.begin();
if(it == vec_ignore.end()){
it = find(vec_del.begin(),vec_del.end(),to_lower(del(s)));
idx = it - vec_del.begin();
if(it == vec_del.end()){
ans.push_back("");
continue;
}
}
}
ans.push_back(wordlist[idx]);
}
return ans;
}