问题
给定一种 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
包含了由单个空格分隔的小写字母。
思路及代码
class Solution:
def wordPattern(self, pattern: str, str: str) -> bool:
# 思路:(哈希表)pattern里面的字符作为键,str里面的单词作为值。
# 第一步:长度是否相同;
# 第二步:键是否已存在,若已存在那么看键对应的值是否是当前的s2[i],要注意的是:不仅要检查键值是否对应,还要检查不同的键是否对应相同的值。
s2 = str.split()
len1 = 0
s1 = []
for ch in pattern:
len1 += 1
s1.append(ch)
len2 = len(s2)
if len1 != len2: # 如果长度不一致,那么一定不匹配。
return False
else:
hash = dict()
# 下面循环只检查了对应的是否相同,没有检查不对应的是否不同
for i in range(len(s1)):
if s1[i] not in hash.keys() and s2[i] not in hash.values():
hash[s1[i]] = s2[i]
elif s1[i] not in hash.keys() and s2[i] in hash.values():
return False
else:
if hash[s1[i]] != s2[i]:
return False
return True
知识点
1. len() 函数是多种数据类型都可以用的,例如:序列类型对象的字符、字符串、列表、元组、字典都能用。
注意:如果表示字典类型的话,len(hash) 表示的是 hash 中键值对的数量。
2. 再次强调 .append(x) 是用在列表中的,字符串是用 '+' 。
3. 这里 len(s1) 求解不符合预期(希望是4,结果是1)的原因在于 pattern是无空字符的的字符串,即没有空格、换行、制表符之类的字符,所以 pattern.split() 并不能把 pattern 划分为一个个的字符。 所以用 .split() 的时候要注意这一点!
4. 类似下图中这句,如果要判断某个键是否在字典中,那么用 if ... in dict.keys(): ,如果判断某个值是否在字典中,那么用 if ... in dict.values(): ,而不能用 if ... in dict(): ,这样会报错:TypeError: 'list' object is not callable.