给定一种 pattern(模式)
和一个字符串 str
,判断 str
是否遵循相同的模式。
这里的遵循指完全匹配,例如, pattern
里的每个字母和字符串 str
中的每个非空单词之间存在着双向连接的对应模式。
示例1:
输入: pattern = "abba", str = "dog cat cat dog"
输出: true
示例 2:
输入:pattern = "abba", str = "dog cat cat fish"
输出: false
示例 3:
输入: pattern = "aaaa", str = "dog cat cat dog"
输出: false
示例 4:
输入: pattern = "abba", str = "dog dog dog dog"
输出: false
说明:
你可以假设 pattern
只包含小写字母, str
包含了由单个空格分隔的小写字母。
解题思路
我们首先想到的思路就是通过map
建立两个字符串之间的映射,但是这种做法是不合理的,因为map
建立的是一种多对一
的映射,而题目的意思是要建立一种一对一
的映射。我们手上有什么工具可以建立这种一对一
的映射呢?现成的东西没有,我们可以通过两个map
实现。
class Solution:
def wordPattern(self, pattern, str_):
"""
:type pattern: str
:type str: str
:rtype: bool
"""
str_map1, str_map2 = {}, {}
str_list = str_.split(' ')
str_list_len = len(str_list)
p_list_len = len(pattern)
if str_list_len != p_list_len:
return False
for i in range(p_list_len):
if str_map1.get(pattern[i]) != str_map2.get(str_list[i]):
return False
str_map1[pattern[i]] = str_map2[str_list[i]] = i
return True
实际上我们是通过建立如下的映射关系实现的。
a -> 0 <- dog
b -> 1 <- cat
b -> 2 <- cat
a -> 3 <- dog True
a -> 0 <- dog
a -> 1 <- cat False get(a) == 0 and get(cat) == None
a -> 2 <- cat
a -> 3 <- dog
我们也可以通过(set
和zip
)组合的方式实现,非常pythonic
class Solution:
def wordPattern(self, pattern, str_):
"""
:type pattern: str
:type str: str
:rtype: bool
"""
str_list = str_.split(' ')
if len(pattern) != len(str_list):
return False
return len(set(zip(pattern, str_list))) == len(set(pattern)) == len(set(str_list))
该问题的其他语言版本添加到了我的GitHub Leetcode
如有问题,希望大家指出!!!