题:https://leetcode.com/problems/vowel-spellchecker/
题目大意
参考原文
解题思路
1.生成 oWordSet 记录所有wordlist ,若query 属于那么返回
2.生成cWordIndexMap 。 遍历wordlist,将元素变为全小写 。将小写的元素作为key,原元素作为val,放入cWordIndexMap 中。若key已经出现,则不放入。
3.生成 vWordIndexMap。遍历wordlist将元素变为全小写,在将小写元素中的元音字符变为 *,将新生成的元素作为key,原元素作为val,放入vWordIndexMap中。若key已经出现,则不放入。
4.每个query ,依次查找上述数据集合。若都没有返回""。
class Solution {
public String[] spellchecker(String[] wordlist, String[] queries) {
Set<Character> vowelsSet = new HashSet<>();
vowelsSet.add('a');
vowelsSet.add('e');
vowelsSet.add('i');
vowelsSet.add('o');
vowelsSet.add('u');
Set<String> oWordSet = new HashSet<>();
for(String word : wordlist)
oWordSet.add(word);
Map<String,String> cWordIndexMap = new HashMap<>();
for(String word : wordlist){
String lowerCaseWord = word.toLowerCase();
if(!cWordIndexMap.containsKey(lowerCaseWord))
cWordIndexMap.put(lowerCaseWord,word);
}
Map<String,String> vWordIndexMap = new HashMap<>();
for(String word : wordlist){
String lowerCaseWord = word.toLowerCase();
StringBuilder strbuilder = new StringBuilder();
for(char c : lowerCaseWord.toCharArray()){
if(vowelsSet.contains(c))
strbuilder.append('*');
else
strbuilder.append(c);
}
if(!cWordIndexMap.containsKey(strbuilder.toString()))
cWordIndexMap.put(strbuilder.toString(),word);
}
String[] resArr =new String[queries.length];
int i = 0;
for(String query :queries){
resArr[i++] = eleSpellchecker(vowelsSet,oWordSet,cWordIndexMap,vWordIndexMap,query);
}
return resArr;
}
private String eleSpellchecker(Set<Character> vowelsSet, Set<String> oWordSet, Map<String, String> cWordIndexMap, Map<String, String> vWordIndexMap, String query) {
if(oWordSet.contains(query)){
return query;
}
String lowerCaseWord = query.toLowerCase();
if(cWordIndexMap.containsKey(lowerCaseWord))
return cWordIndexMap.get(lowerCaseWord);
StringBuilder strbuilder = new StringBuilder();
for(char c : lowerCaseWord.toCharArray()){
if(vowelsSet.contains(c))
strbuilder.append('*');
else
strbuilder.append(c);
}
if(cWordIndexMap.containsKey(strbuilder.toString()))
return cWordIndexMap.get(strbuilder.toString());
return "";
}
}
2.生成cWordIndexMap、vWordIndexMap 可以合并。使得代码更简单
class Solution {
public String[] spellchecker(String[] wordlist, String[] queries) {
Set<Character> vowelsSet = new HashSet<>();
vowelsSet.add('a');
vowelsSet.add('e');
vowelsSet.add('i');
vowelsSet.add('o');
vowelsSet.add('u');
Set<String> oWordSet = new HashSet<>();
for(String word : wordlist)
oWordSet.add(word);
Map<String,String> cWordIndexMap = new HashMap<>();
Map<String,String> vWordIndexMap = new HashMap<>();
for(String word : wordlist){
String lowerCaseWord = word.toLowerCase();
if(!cWordIndexMap.containsKey(lowerCaseWord))
cWordIndexMap.put(lowerCaseWord,word);
StringBuilder strbuilder = new StringBuilder();
for(char c : lowerCaseWord.toCharArray()){
if(vowelsSet.contains(c))
strbuilder.append('*');
else
strbuilder.append(c);
}
if(!cWordIndexMap.containsKey(strbuilder.toString()))
cWordIndexMap.put(strbuilder.toString(),word);
}
String[] resArr =new String[queries.length];
int i = 0;
for(String query :queries){
resArr[i++] = eleSpellchecker(vowelsSet,oWordSet,cWordIndexMap,vWordIndexMap,query);
}
return resArr;
}
private String eleSpellchecker(Set<Character> vowelsSet, Set<String> oWordSet, Map<String, String> cWordIndexMap, Map<String, String> vWordIndexMap, String query) {
if(oWordSet.contains(query)){
return query;
}
String lowerCaseWord = query.toLowerCase();
if(cWordIndexMap.containsKey(lowerCaseWord))
return cWordIndexMap.get(lowerCaseWord);
StringBuilder strbuilder = new StringBuilder();
for(char c : lowerCaseWord.toCharArray()){
if(vowelsSet.contains(c))
strbuilder.append('*');
else
strbuilder.append(c);
}
if(cWordIndexMap.containsKey(strbuilder.toString()))
return cWordIndexMap.get(strbuilder.toString());
return "";
}
}