題目地址:
https://leetcode.com/problems/most-common-word/
給定一個英文段落,單詞之間以標點符號空格等分隔,再給定一個字符串數組,要求求出段落中不在數組裏的出現次數最多的單詞。單詞不分大小寫,數組裏的字符串保證是小寫。
用前後雙指針。每次分隔出一個單詞後就加進哈希表,記錄一下單詞出現的次數。代碼如下:
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class Solution {
public String mostCommonWord(String paragraph, String[] banned) {
String res = "";
int maxLen = 0;
Map<String, Integer> map = new HashMap<>();
int i = 0;
while (i < paragraph.length()) {
// 找到第一個是字母的字符
while (i < paragraph.length() && !Character.isLetter(paragraph.charAt(i))) {
i++;
}
// 如果找到了末尾,說明找完了,跳出循環
if (i == paragraph.length()) {
break;
}
// 從下一個字符開始找第一個不是字母的
int j = i + 1;
while (j < paragraph.length() && Character.isLetter(paragraph.charAt(j))) {
j++;
}
// 分割出單詞,轉換爲小寫,加進哈希表
String cur = paragraph.substring(i, j).toLowerCase();
map.put(cur, map.getOrDefault(cur, 0) + 1);
// 找下一個單詞
i = j + 1;
}
// 開一個哈希表存ban掉的單詞,方便判斷一個單詞有沒有ban掉
Set<String> set = new HashSet<>();
for (String s : banned) {
set.add(s);
}
for (Map.Entry<String, Integer> entry : map.entrySet()) {
if (!set.contains(entry.getKey()) && entry.getValue() > maxLen) {
res = entry.getKey();
maxLen = entry.getValue();
}
}
return res;
}
}