题目描述:
在给定单词列表 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 = “yollow”: correct = “YellOw”
例如:wordlist = [“YellOw”], query = “yeellow”: correct = “” (无匹配项)
例如:wordlist = [“YellOw”], query = “yllw”: correct = “” (无匹配项)
此外,拼写检查器还按照以下优先级规则操作:
当查询完全匹配单词列表中的某个单词(区分大小写)时,应返回相同的单词。
当查询匹配到大小写问题的单词时,您应该返回单词列表中的第一个这样的匹配项。
当查询匹配到元音错误的单词时,您应该返回单词列表中的第一个这样的匹配项。
如果该查询在单词列表中没有匹配项,则应返回空字符串。
给出一些查询 queries,返回一个单词列表 answer,其中 answer[i] 是由查询 query = queries[i] 得到的正确单词。
示例:
输入:wordlist = [“KiTe”,“kite”,“hare”,“Hare”], queries = [“kite”,“Kite”,“KiTe”,“Hare”,“HARE”,“Hear”,“hear”,“keti”,“keet”,“keto”]
输出:[“kite”,“KiTe”,“KiTe”,“Hare”,“hare”,"","",“KiTe”,"",“KiTe”]
提示:
1 <= wordlist.length <= 5000
1 <= queries.length <= 5000
1 <= wordlist[i].length <= 7
1 <= queries[i].length <= 7
wordlist 和 queries 中的所有字符串仅由英文字母组成。
方法1:
主要思路:解题汇总链接
(1)将原来的单词列表转为三个哈希,第一个哈希存储单词列表中的原始单词,第二个哈希存储单词列表中的单词转化为对应的统一的小写的字符串,第三个哈希存储对应的小写字符串中,各个元音字符转为‘’字符的字符串;
(2)转换过程中注意第一次第一次匹配的条件;
(3)对于要插叙的字符串,先使用第一个哈希,若匹配上,则直接压入对应的字符串;
(4)否则,将查询字符串转为对应的小写字符串,再使用第二个哈希进行查询,存在,压入对应的字符串;
(5)否则,将转换的小写字符串中对应的可能存在原因字符转为 ‘’,进行查询,存在,压入对应的字符串;
(6)否则,将空字符串压入;
class Solution {
public:
vector<string> spellchecker(vector<string>& wordlist, vector<string>& queries) {
unordered_set<string> st;//存储原字符串
unordered_map<string,int> mp_1;//存储对应的小写字符串
unordered_map<string,int> mp_2;//存储对应的小写字符串中的原因字符转为‘*’的字符串
for(int i=0;i<wordlist.size();++i){
st.insert(wordlist[i]);//存储原始字符串
string little_str=wordlist[i];
for(char&ch:little_str){//转为对应的小写字符串
if(ch>='A'&&ch<='Z'){
ch+='a'-'A';
}
}
if(mp_1.count(little_str)==0){//存储对应的小写字符串
mp_1[little_str]=i;
}
for(char&ch:little_str){//转换小写字符串中的元音字符
if(ch=='a'||ch=='e'||ch=='i'||
ch=='o'||ch=='u'){
ch='*';
}
}
if(little_str!=wordlist[i]&&mp_2.count(little_str)==0){//存储转换元音字符后的字符串
mp_2[little_str]=i;
}
}
vector<string> res;
for(string&q:queries){
if(st.count(q)){//查询原字符串
res.push_back(q);
}
else{
for(char&ch:q){
if(ch>='A'&&ch<='Z'){
ch+='a'-'A';
}
}
string tmp=q;
for(char&ch:tmp){
if(ch=='a'||ch=='e'||ch=='i'||
ch=='o'||ch=='u'){
ch='*';
}
}
if(mp_1.count(q)){//查询小写字符串
res.push_back(wordlist[mp_1[q]]);
}
else if(mp_2.count(tmp)){//查询转换元音字符后的字符串
res.push_back(wordlist[mp_2[tmp]]);
}
else{
res.push_back("");
}
}
}
return res;
}
};