目录
一、题目
给定一种规律 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 包含了由单个空格分隔的小写字母。
三、思路
1、首先先将字符串 s 进行切片,分隔符为空格;
2、match字典,用于存储pattern和字符串s中的单词,pattern中的值作为match的key值,字符串中的单词作为match中的value值。
例如:match = {'a': 'dog', 'b': 'cat'}
3、分两种情况:
- 第一种:当字符串s的长度与pattern长度不相等,不匹配,返回False;
- 第二种:当字符串s的长度与pattern长度相等
遍历字符串s和pattern
- 当pattern[i]不存在与match字典中时:
如果与之对应的单词s[i]在字典中,不匹配,则返回False;
如果没有与之对应的s[i]单词,则将其加入到字典match中;
- 当pattern[i]存在于match[i]字典中:
如果与之对应的单词s[i]在字典中,当前匹配,则继续;
如果没有与之对应的s[i]单词,不匹配,则返回False。
四、代码
class Solution:
def wordPattern(self, pattern: str, s: str) -> bool:
"""
:param pattern: str
:param s: str
:return: bool
"""
s = s.split()
match = dict()
# str中单词数和pattern长度不相同,返回False
if len(s) != len(pattern):
return False
for i in range(len(s)):
if pattern[i] not in match:
if s[i] in match.values():
return False
match[pattern[i]] = s[i]
else:
if s[i] != match[pattern[i]]:
return False
return True
if __name__ == '__main__':
pattern = "abba"
# strs = "dog cat cat dog"
strs = "dog cat cat fish"
s = Solution()
ans = s.wordPattern(pattern, strs)
print(ans)