题目来源:
leetcode题目,网址:819. 最常见的单词 - 力扣(LeetCode)
解题思路:
遍历字符串,使用 map 保存单词及其出现次数,返回出现次数最多的非禁用单词。
解题代码:
class Solution {
public String mostCommonWord(String paragraph, String[] banned) {
Map<String,Integer> map=new HashMap<>();
//禁用词汇放入map,计数为-1
for(String str:banned){
map.put(str,-1);
}
//列表词汇放入map
StringBuffer word=new StringBuffer();
for(int i=0;i<paragraph.length();i++){
char c=paragraph.charAt(i);
if(Character.isLowerCase(c)){
word.append(c);
}else if(Character.isUpperCase(c)){
word.append((char)(c-'A'+'a'));
}else {
if(word.length()==0){
continue;
}
int mapNum=map.getOrDefault(word.toString(),0);
if(mapNum!=-1){
map.put(word.toString(),mapNum+1);
}
word=new StringBuffer();
}
}
if(word.length()!=0){
int mapNum=map.getOrDefault(word.toString(),0);
if(mapNum!=-1){
map.put(word.toString(),mapNum+1);
}
word=new StringBuffer();
}
//寻找出现次数最多的
String str="";
int count=-1;
for(Map.Entry<String,Integer> entry:map.entrySet()){
if(entry.getValue()>count){
count=entry.getValue();
str=entry.getKey();
}
}
return str;
}
}
总结:
刚开始使用 " " 分隔字符串,再删去非字母字符,最后得到单词,但运行不通过,用例中出现类似于 "a,s,d" 的子字符串,无法处理。
官方题解给出的也是哈希表+计数的解法。