一、题目
给定一个段落 (paragraph) 和一个禁用单词列表 (banned)。返回出现次数最多,同时不在禁用列表中的单词。
题目保证至少有一个词不在禁用列表中,而且答案唯一。
禁用列表中的单词用小写字母表示,不含标点符号。段落中的单词不区分大小写。答案都是小写字母。
题目链接如下:819. 最常见的单词
二、完整代码
代码如下(示例):
class Solution {
public String mostCommonWord(String paragraph, String[] banned) {
// 将字符串分解为字符数组
char[] chars = paragraph.toCharArray();
// 将禁用词放进set集合中,方便后续判断
Set<String> set = new HashSet<>(Arrays.asList(banned));
// 创建map,用于保存单词以及单词出现的频率
Map<String, Integer> map = new HashMap<>();
String ans = null;
int n = paragraph.length();
for (int i = 0; i < n;) {
// 判断如果不是字符,则将索引向后移动,并跳过后续操作
// 1.问题记录点:没有添加对非字母操作的判断
if (!Character.isLetter(chars[i])) {
i++;
continue;
}
// 获取单词
int j = i;
while (j < n && Character.isLetter(chars[j])) {
j++;
}
String word = paragraph.substring(i, j).toLowerCase();
map.put(word, map.getOrDefault(word, 0) + 1);
// 将索引后移
// 2.问题记录点:没有将索引后移
i = j + 1;
// 判断如果是禁用词,则将序号向后移动,并跳过后续操作
if (set.contains(word)) {
continue;
}
if (ans == null || map.get(word) > map.get(ans)) {
ans = word;
}
}
return ans;
}
}
三、问题记录
- 没有添加对非字母操作的判断
- 没有将索引后移,就去判断禁用词,导致代码执行之后一直在循环内,造成超时。
四、解决问题
解决办法说来也简单,添加注释。最近做力扣题都少了注释,导致了判断的遗漏。