819.最常见的单词

89 阅读1分钟

题目:
给定一个段落 (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)
}