题目:
给定一个段落 (paragraph) 和一个禁用单词列表 (banned)。返回出现次数最多,同时不在禁用列表中的单词。
题目保证至少有一个词不在禁用列表中,而且答案唯一。
禁用列表中的单词用小写字母表示,不含标点符号。段落中的单词不区分大小写。答案都是小写字母。
算法:
方法一:模拟法
func mostCommonWord(paragraph string, banned []string) string {
wordCount := make(map[string]int)
bannedMap := make(map[string]struct{})
for i := range banned {
bannedMap[lower(banned[i])] = struct{}{}
}
count, ans := 0, ""
letterStart := false
start := 0
for i := range paragraph {
if !isLetter(paragraph[i]) || i == len(paragraph) - 1 {
if letterStart {
end := i
if i == len(paragraph) - 1 && isLetter(paragraph[i]) {
end = i + 1
}
str := lower(string(paragraph[start:end]))
if _, ok := bannedMap[str]; !ok {
wordCount[str] ++
if wordCount[str] > count {
count = wordCount[str]
ans = str
}
}
letterStart = false
}
continue
}
if !letterStart {
letterStart = true
start = i
}
}
// fmt.Println(wordCount, bannedMap)
return ans
}
func isLetter(byt byte) bool {
return ('a' <= byt && byt <= 'z') || ('A' <= byt && byt <= 'Z')
}
func lower(str string) string {
arr := []byte(str)
for i := range arr {
if 'A' <= arr[i] && arr[i] <= 'Z' {
arr[i] = arr[i] + 'a' -'A'
}
}
return string(arr)
}