Leetcode0819. 最常见的单词(simple)

目录

1. 题目描述

2. 解题分析

3. 代码实现


1. 题目描述

给定一个段落 (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"不是最终的答案,虽然它出现次数更多,但它在禁用单词列表中。

提示:

  • 1 <= 段落长度 <= 1000
  • 0 <= 禁用单词个数 <= 100
  • 1 <= 禁用单词长度 <= 10
  • 答案是唯一的, 且都是小写字母 (即使在 paragraph 里是大写的,即使是一些特定的名词,答案都是小写的。)
  • paragraph 只包含字母、空格和下列标点符号!?',;.
  • 不存在没有连字符或者带有连字符的单词。
  • 单词里只包含字母,不会出现省略号或者其他标点符号。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/most-common-word
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题分析

  • 首先,将所有字符统一变成小写。
  • 其次,以空格和逗号为分割符分离出各个单词,然后判断它是否存在于禁止列表
    • 如果在,则跳过
    • 如果不在,则对应计数器加一

        用一个哈希表来维护各单词的计数器。

        在Python中可以中字符串方法str.split()进行单词分割,但是在paragraph中还可能出现标点符号也需要清理掉。可以考虑先将这些标点符号替换为空格符,然后再基于空格作为分隔符进行单词分割。

        

3. 代码实现

from typing import List
class Solution:
    def mostCommonWord(self, paragraph: str, banned: List[str]) -> str:
        para = paragraph.lower()
        for c in ["!", ";", "'", "?", ".", ","]:
            para = para.replace(c, " ")
        print(para)
        wlist = para.split()
        print(wlist)
        cnts  = dict()
        for w in wlist:
            if w not in banned:
                if w not in cnts:
                    cnts[w] = 1
                else:
                    cnts[w] = cnts[w] + 1
        print(cnts)
        maxcnt = 0
        for key in cnts:
            if cnts[key] > maxcnt:
                maxcnt  = cnts[key]
                maxword = key
        return maxword

if __name__ == "__main__":
    import time
    sln = Solution()
    
    # paragraph = "Bob hit a ball, the hit BALL flew far after it was hit."
    # banned = ["hit"]
    # print(sln.mostCommonWord(paragraph, banned))

    # paragraph = "Bob. hIt, baLl"
    # banned = ["bob", "hit"]  
    # print(sln.mostCommonWord(paragraph, banned))
    
    paragraph = "L, P! X! C; u! P? w! P. G, S? l? X? D. w? m? f? v, x? i. z; x' m! U' M! j? V; l. S! j? r, K. O? k? p? p, H! t! z' X! v. u; F, h; s? X? K. y, Y! L; q! y? j, o? D' y? F' Z; E? W; W' W! n! p' U. N; w? V' y! Q; J, o! T? g? o! N' M? X? w! V. w? o' k. W. y, k; o' m! r; i, n. k, w; U? S? t; O' g' z. V. N? z, W? j! m? W! h; t! V' T! Z? R' w, w? y? y; O' w; r? q. G, V. x? n, Y; Q. s? S. G. f, s! U? l. o! i. L; Z' X! u. y, Q. q; Q, D; V. m. q. s? Y, U; p? u! q? h? O. W' y? Z! x! r. E, R, r' X' V, b. z, x! Q; y, g' j; j. q; W; v' X! J' H? i' o? n, Y. X! x? h? u; T? l! o? z. K' z' s; L? p? V' r. L? Y; V! V' S. t? Z' T' Y. s? i? Y! G? r; Y; T! h! K; M. k. U; A! V? R? C' x! X. M; z' V! w. N. T? Y' w? n, Z, Z? Y' R; V' f; V' I; t? X? Z; l? R, Q! Z. R. R, O. S! w; p' T. u? U! n, V, M. p? Q, O? q' t. B, k. u. H' T; T? S; Y! S! i? q! K' z' S! v; L. x; q; W? m? y, Z! x. y. j? N' R' I? r? V! Z; s, O? s; V, I, e? U' w! T? T! u; U! e? w? z; t! C! z? U, p' p! r. x; U! Z; u! j; T! X! N' F? n! P' t, X. s; q'"
    banned = ["m","i","s","w","y","d","q","l","a","p","n","t","u","b","o","e","f","g","c","x"]
    print(sln.mostCommonWord(paragraph, banned))

        执行用时:36 ms, 在所有 Python3 提交中击败了82.16%的用户

        内存消耗:15.2 MB, 在所有 Python3 提交中击败了7.89%的用户

        虽然是一道简单的题目,但是却提交了3次才成功。细节决定成败啊。。。

        第一次提交失败是因为字符串方法split()。要注意str.split()与str.split(“ ”),一般情况下用后者都是属于画蛇添足,自取烦恼。

        第二次提交失败是因为题目要求中的paragraph中存在的标点符号中的“;”错看成“:”。。。老眼昏花了^-^

        

        回到主目录:笨牛慢耕的Leetcode每日一解题解笔记(动态更新。。。) 

猜你喜欢

转载自blog.csdn.net/chenxy_bwave/article/details/124224223
今日推荐