单词规律
问题描述
字典解法
class Solution:
def wordPattern(self, pattern: str, str: str) -> bool:
a={}
p=list(pattern)
q=str.split(" ")
if len(p)!=len(q):
return False
elif(len(set(p))!=len(set(q))):
return False
else:
for i in range(len(p)):
if p[i] not in a:
a[p[i]]=q[i]
else:
if a[p[i]]!=q[i]:
return False
if len(set(a.keys()))==len(set(a.values())):
return True
else:
return False
tips:
1.zip()和zip(* )
zip()可以将对象中对应的元素打包成一个个元组
zip(*)可以理解为解压
借用zip
把pattern和str的对应元素打包成元组,再变为几个,解压后两个里面的值应该都是无重复且长度相等。
class Solution:
def wordPattern(self, pattern: str, str: str) -> bool:
if len(str.split(" ")) != len(list(pattern)):
return False
for l in zip(*set(zip(list(pattern), str.split(" ")))):
if len(l) != len(set(l)):
return False
return True
也可以不解压,pattern的集合的长度应该等于str的集合的长度等于zip后的集合的长度。
时间复杂度减小
class Solution:
def wordPattern(self, pattern: str, str: str) -> bool:
s1=str.split(' ')
if len(pattern) != len(s1):
return False
if len(set(zip(list(pattern),s1)))==len(set(s1))==len(set(pattern)):
return True
else:
return False
class Solution:
def wordPattern(self, pattern: str, str: str) -> bool:
res=str.split()
return list(map(pattern.index, pattern))==list(map(res.index,res))
map() .index
map() 会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
list.index则是对每个元素进行寻找该元素的索引位置。
class Solution:
def wordPattern(self, pattern: str, str: str) -> bool:
res=str.split()
return list(map(pattern.index, pattern))==list(map(res.index,res))
abba逐个元素找索引位置即为0110