单词规律

标签: 哈希表 字符串

难度: Easy

给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。

这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。

示例1:

输入: pattern = "abba", s = "dog cat cat dog"
输出: true

示例 2:

输入:pattern = "abba", s = "dog cat cat fish"
输出: false

示例 3:

输入: pattern = "aaaa", s = "dog cat cat dog"
输出: false

提示:

  • 1 <= pattern.length <= 300
  • pattern 只包含小写英文字母
  • 1 <= s.length <= 3000
  • s 只包含小写英文字母和 ' '
  • s 不包含 任何前导或尾随对空格
  • s 中每个单词都被 单个空格 分隔

Submission

运行时间: 19 ms

内存: 16.0 MB

class Solution:
    def wordPattern(self, pattern: str, s: str) -> bool:
        s = s.split(" ")
        # 不等长必定不能一一对应
        if len(pattern) != len(s):
            return False
        # 将两个字符串连接在一起, 若规律相同, 则几个结果的集合应该具有相同长度
        t = list(map(lambda x, y: x + y, pattern, s))
        return len(set(pattern)) == len(set(s)) == len(set(t))

Explain

这个题解的思路是利用集合的特性来判断 pattern 和字符串 s 是否遵循相同的规律。首先将字符串 s 按空格分割成一个单词列表,然后判断 pattern 和单词列表的长度是否相等,若不相等则必定不能一一对应。接下来,通过 map 函数将 pattern 中的每个字符和单词列表中的每个单词连接在一起形成一个新的列表 t。如果 pattern 和 s 遵循相同的规律,那么 pattern、单词列表 s 以及连接后的列表 t 转换为集合后,它们的长度应该都是相等的。

时间复杂度: O(n + m)

空间复杂度: O(n + m)

class Solution:
    def wordPattern(self, pattern: str, s: str) -> bool:
        s = s.split(" ")  # 将字符串 s 按空格分割成单词列表
        # 不等长必定不能一一对应
        if len(pattern) != len(s):
            return False
        # 将两个字符串连接在一起, 若规律相同, 则几个结果的集合应该具有相同长度
        t = list(map(lambda x, y: x + y, pattern, s))  # 将 pattern 中的每个字符和单词列表中的每个单词连接在一起形成新列表 t
        return len(set(pattern)) == len(set(s)) == len(set(t))  # 判断 pattern、单词列表 s 以及连接后的列表 t 转换为集合后的长度是否相等

Explore

在这个题解中,如果pattern和s遵循相同的规律,意味着每个字符在pattern中的出现与s中的单词之间存在一对一映射关系。通过检查集合长度我们实际上在确认映射的唯一性和一致性。如果pattern的不同字符映射到s的不同单词(集合长度相等),同时每个组合(字符+单词)都是唯一的(t的集合长度也相等),则说明每个字符和单词之间的映射是一对一的,且一致遵从相同的规律。因此,三者的集合长度相等确实可以判断s是否遵循pattern的规律。

此方法主要是基于假设没有两个不同的字符或单词会生成相同的组合字符串(例如'a'和'plane'与'ap'和'lane'产生相同的连接字符串'aplane')。如果出现这种情况,尽管实际上没有遵循相同的规律,程序可能仍然返回true。这是一个边缘情况,但在实际应用中应考虑此类潜在的冲突。

题解中确实提到了如果pattern和单词列表s的长度不相等,程序将直接返回false。这是因为不同长度意味着无法建立一对一的映射关系,因此在这种情况下,无需进一步检查,程序将判断s不遵循pattern的规律。

使用lambda和map的组合可以提供更简洁的代码,避免了显式的循环结构,增加了代码的可读性和简洁性。然而,这种方法的劣势在于可能会略微降低代码的执行效率(因为lambda函数的调用开销),并且对于不熟悉这种函数式编程风格的开发者来说,可能会稍显复杂。