题目:
给定一种 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
包含了由单个空格分隔的小写字母。
我的解答:
思路是,比较两个字符串中元素个数。再分别将两个字符串中相同的字母替换为当前步数i,再判断两个字符串是否相等。有重复操作且并不能正确解答。
class Solution(object):
def wordPattern(self, pattern, str):
"""
:type pattern: str
:type str: str
:rtype: bool
"""
str1 = str.split(' ')
if len(pattern) != len(str1):
return False
else:#前面是return,所以可省掉这个else
for i in range(len(str1)):
if pattern.count(pattern[i]) != str1.count(str1[i]):
return False
for j in range(i,len(str1)):
if pattern[i] == pattern[j]:
pattern = pattern[:i] + str(i) + pattern[i+1:]
pattern = pattern[:j] + str(i) + pattern[j+1:]
if str1[i] == str1[j]:
str1 = str1[:i] + str(i) + str1[i+1:]
str1 = str1[:j] + str(i) + str1[j+1:]
if pattern == str1:
return True
else:
return False
受题205重构字符串启发,第二次尝试成功了:
class Solution(object):
def wordPattern(self, pattern, str):
"""
:type pattern: str
:type str: str
:rtype: bool
"""
#第二次尝试,受题205重构字符串启发,先判断len,不然也会报错
str1 = str.split(' ')
if len(pattern) != len(str1):
return False
return len(set(zip(pattern, str1))) == len(set(pattern)) == len(set(str1))
参考一下别人的解答:
https://blog.csdn.net/IT_job/article/details/80447451
思路是,对pattern中的每一个字母,dic中没有这个字母就加上,有就判断str中对应位置的单词是否对应。dic就是字母与单词的映射表。
class Solution(object):
def wordPattern(self, pattern, str):
"""
:type pattern: str
:type str: str
:rtype: bool
"""
dic = {}
strToList= str.split()
if len(pattern) != len(strToList) or len(set(pattern)) != len(set(strToList)):
return False
for i, val in enumerate(pattern):
if val not in dic:
dic[val] = strToList[i]
elif dic[val] != strToList[i]:
return False
return True