返回

破解 LeetCode 难题:找出段落中最常见的单词

Android

引言:

准备在 LeetCode 的竞技场上大显身手吗?我们踏上了一段扣人心弦的旅程,探索算法的奥秘。今日的挑战:找出段落中最常见的单词,它将考验我们的逻辑思维和代码实现能力。

问题分解:

我们的目标是找出段落中出现的频率最高的单词,同时排除给定的禁用单词列表。问题分解如下:

  • 输入:
    • 段落 (paragraph):一个字符串,包含空格分隔的单词。
    • 禁用单词列表 (banned):一个字符串数组,包含禁用单词。
  • 输出:
    • 最常见的单词:一个字符串,是段落中出现频率最高的单词,且不在禁用单词列表中。

算法设计:

我们将采用分而治之的方法来解决此问题:

  1. 预处理:
    • 将段落转换为小写并按空格拆分成单词列表。
    • 创建一个哈希表来存储单词及其出现次数。
  2. 筛选禁用单词:
    • 遍历哈希表,删除禁用单词及其出现次数。
  3. 确定最常见单词:
    • 再次遍历哈希表,找到出现次数最高的单词。
  4. 处理特殊情况:
    • 若有多个单词出现次数相同,则返回按字母顺序排列的第一个单词。

代码实现:

def find_most_common_word(paragraph, banned):
  # 预处理
  words = paragraph.lower().split()
  word_counts = {}
  for word in words:
    if word not in word_counts:
      word_counts[word] = 0
    word_counts[word] += 1

  # 筛选禁用单词
  for word in banned:
    if word in word_counts:
      del word_counts[word]

  # 确定最常见单词
  most_common_word = ""
  max_count = 0
  for word, count in word_counts.items():
    if count > max_count:
      most_common_word = word
      max_count = count
    elif count == max_count:
      most_common_word = min(most_common_word, word)

  return most_common_word

复杂度分析:

  • 时间复杂度:O(n),其中 n 是段落中单词的数量。
  • 空间复杂度:O(n),用于存储单词计数的哈希表。