题目地址:
https://www.lintcode.com/problem/most-common-word/description
给定一个英文句子,包含若干单词(以空格分割),如果有标点,则标点紧接着前面是一个单词,后面是一个空格再跟下面的单词。再给定若干限定词,要求返回出现次数最多的且不在限定词内的单词。
直接用哈希表统计即可。代码如下:
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class Solution {
/**
* @param paragraph:
* @param banned:
* @return: nothing
*/
public String mostCommonWord(String paragraph, String[] banned) {
// write your code here
// 将限定词加入set
Set<String> set = new HashSet<>();
for (String s : banned) {
set.add(s.toLowerCase());
}
Map<String, Integer> map = new HashMap<>();
String[] ss = paragraph.split(" ");
for (String s : ss) {
// 去掉尾部的标点
if (!Character.isLetter(s.charAt(s.length() - 1))) {
s = s.substring(0, s.length() - 1);
}
s = s.toLowerCase();
if (!set.contains(s)) {
map.put(s, map.getOrDefault(s, 0) + 1);
}
}
int maxOcc = 0;
String res = "";
for (Map.Entry<String, Integer> entry : map.entrySet()) {
if (entry.getValue() > maxOcc) {
maxOcc = entry.getValue();
res = entry.getKey();
}
}
return res;
}
}
时空复杂度 O ( n ) O(n) O(n), n n n为字符串长度。