给定一个段落 (paragraph) 和一个禁用单词列表 (banned)。返回出现次数最多,同时不在禁用列表中的单词。
题目保证至少有一个词不在禁用列表中,而且答案唯一。
禁用列表中的单词用小写字母表示,不含标点符号。段落中的单词不区分大小写。答案都是小写字母。
class Solution {
public String mostCommonWord(String paragraph, String[] banned) {
Set<String> set = new HashSet<>(Arrays.asList(banned));
set.add(""); //因为双指针截取到的字符串有可能是空字符串"",所以把""添加到set里,for的时候去除掉""
String res = ""; //返回的结果
int max = 0; //出现的最多的次数
paragraph += "."; //加上结束点,防止字符串没结束点for出错
Map<String, Integer> map = new HashMap<>();
//双指针
int index = 0; //记录单词的起始位
for (int i = 0; i < paragraph.length(); i++) {
char c = paragraph.charAt(i);
//当前字符是字母则跳过
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) continue;
else {
//如果不是字母,截取单词
String word = paragraph.substring(index, i);
word = word.toLowerCase();
//不是非禁单词
if (!set.contains(word)) {
//如果map中存在这个单词,value加1,否则新建
map.put(word, map.getOrDefault(word, 0) + 1);
//比较最大值
if (map.get(word) > max) {
res = word;
max = map.get(word);
}
}
}
index = i + 1;
}
return res;
}
}
这道题做了1个多小时都完成不了,改了运行,运行了出错,然后实在是没思路了,跑去看题解区,思路和FlyChenKai
差不多,参照着他的题解,勉强完成,等以后再做一次。