題目描述:
給定乙個段落 (paragraph) 和乙個禁用單詞列表 (banned)。返回出現次數最多,同時不在禁用列表中的單詞。
題目保證至少有乙個詞不在禁用列表中,而且答案唯一。
禁用列表中的單詞用小寫字母表示,不含標點符號。段落中的單詞不區分大小寫。答案都是小寫字母。
示例:
輸入: paragraph = 「bob hit a ball, the hit ball flew far after it was思路:hit.」 banned = [「hit」] 輸出: 「ball」 解釋: 「hit」 出現了3次,但它是乙個禁用的單詞。
「ball」 出現了2次 (同時沒有其他單詞出現2次),所以它是段落裡出現次數最多的,且不在禁用列表中的單詞。
注意,所有這些單詞在段落裡不區分大小寫,標點符號需要忽略(即使是緊挨著單詞也忽略, 比如 「ball,」),
"hit"不是最終的答案,雖然它出現次數更多,但它在禁用單詞列表中。
思路: 利用 hashmap 實現
這個題目看似簡單, 實則有很多坑:
1. 段落中大小寫字母都有, 但 banned 中只有小寫字母
2. 段落中單詞的間隔不僅僅有空格, 還有標點符號, 這樣就不能直接根據 string 型別存入 hashmap 中
解決方法:
1. 先把 banned 存入乙個 hashset 中, 以便於判斷
2. 逐個字元遍歷整個段落, 如果遇到標點符號, 就把之前遍歷的字母轉小寫作為乙個單詞
3. 判斷這個單詞是否在 hashset 中存在, 如果不存在, 就存到 hashmap 中
4. 把每個單詞的 key 和 value 值記錄下來, 並不斷更新, 儲存最大值, 最後返回記錄最大值的單詞即可
**實現:
public string mostcommonword
(string paragraph, string[
] banned)
hashmap
map =
newhashmap
<
>()
; string result =
" ";
// 用於存放更新最大值的單詞
int max =0;
// 用於存放更新單詞的 value
stringbuilder word =
newstringbuilder()
;// 用於存放遍歷 paragraph 得到的每個單詞
paragraph +=
".";
// 處理 paragraph 中的最後乙個單詞
for(
char c : paragraph.
tochararray()
)else
if(word.
length()
>0)
}// 這裡已經處理完 word 裡存的這個單詞了, 需要更新 word 記錄 paragraph 中的下乙個單詞
word =
newstringbuilder()
;}}// 這裡 result 中存的就是 map 中 value 最大的元素
return result;
}
819 最常見的單詞
給定乙個段落 paragraph 和乙個禁用單詞列表 banned 返回出現次數最多,同時不在禁用列表中的單詞。題目保證至少有乙個詞不在禁用列表中,而且答案唯一。禁用列表中的單詞用小寫字母表示,不含標點符號。段落中的單詞不區分大小寫。答案都是小寫字母。示例 輸入 paragraph bob hit ...
leetcode 最常見的單詞
題目 給定乙個段落 paragraph 和乙個禁用單詞列表 banned 返回出現次數最多,同時不在禁用列表中的單詞。題目保證至少有乙個詞不在禁用列表中,而且答案唯一。禁用列表中的單詞用小寫字母表示,不含標點符號。段落中的單詞不區分大小寫。答案都是小寫字母。輸入 paragraph bob hit ...
Leetcode 819 最常見的單詞
給定乙個段落 paragraph 和乙個禁用單詞列表 banned 返回出現次數最多,同時不在禁用列表中的單詞。題目保證至少有乙個詞不在禁用列表中,而且答案唯一。禁用列表中的單詞用小寫字母表示,不含標點符號。段落中的單詞不區分大小寫。答案都是小寫字母。示例 輸入 paragraph bob hit ...