返回

通过字典巧解 Word Pattern

后端

在编程世界中,有许多看似简单的算法问题,却隐藏着一些技巧和陷阱,让算法工程师们大呼上当。LeetCode 290. Word Pattern 就是这样一个问题。

这个看似简单的模式匹配问题,却暗藏着"双映射"的陷阱。不少程序员刚开始解题时,往往只考虑单方面的映射,即单词与模式的映射。然而,题目要求的是双向映射,也就是说,既要保证单词到模式的唯一映射,也要保证模式到单词的唯一映射。

双映射:双向映射的关键

举个例子,如果模式是 "abba",单词是 "dog cat cat dog",那么这种映射是合法的,因为每个模式字符都对应一个唯一的单词,反之亦然。然而,如果模式是 "abba",单词是 "dog dog dog dog",那么这种映射就是无效的,因为模式字符 "a" 被映射到多个单词。

字典实现:巧用数据结构

要高效地实现双映射,我们可以使用字典数据结构。字典本质上是一个键值对集合,键是唯一的。因此,我们可以使用字典来存储模式字符到单词的映射和单词到模式字符的映射。

以下是如何使用字典解决 LeetCode 290. Word Pattern 问题的 Python 代码:

def wordPattern(pattern, str):
  """
  :type pattern: str
  :type str: str
  :rtype: bool
  """
  # 创建两个字典,分别存储模式字符到单词的映射和单词到模式字符的映射
  pattern_to_word = {}
  word_to_pattern = {}

  # 将模式和单词分割成列表
  pattern_list = list(pattern)
  word_list = str.split()

  # 检查模式和单词列表长度是否相等
  if len(pattern_list) != len(word_list):
    return False

  # 遍历模式和单词列表,同时检查双向映射
  for i in range(len(pattern_list)):
    pattern_char = pattern_list[i]
    word = word_list[i]

    # 检查模式字符到单词的映射
    if pattern_char not in pattern_to_word:
      pattern_to_word[pattern_char] = word
    elif pattern_to_word[pattern_char] != word:
      return False

    # 检查单词到模式字符的映射
    if word not in word_to_pattern:
      word_to_pattern[word] = pattern_char
    elif word_to_pattern[word] != pattern_char:
      return False

  # 如果所有映射都合法,则返回 True
  return True

结语

通过巧妙地利用字典数据结构和双映射的概念,我们可以轻松解决 LeetCode 290. Word Pattern 问题。在解决类似问题时,始终要深入理解题目要求,避免陷入单向映射的陷阱。字典可以有效地帮助我们管理映射关系,为解决复杂数据处理问题提供强大的工具。