题目描述
你有两个字符串,即pattern和value。
pattern字符串由字母"a"和"b"组成,用于描述字符串中的模式。
例如,字符串"catcatgocatgo"匹配模式"aabab"(其中"cat"是"a",“go"是"b”),该字符串也匹配像"a"、"ab"和"b"这样的模式。但需注意"a"和"b"不能同时表示相同的字符串。
编写一个方法判断value字符串是否匹配pattern字符串。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pattern-matching-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
算法思路
刚刚看到题的时候是懵逼的,想了想更加的懵逼,得嘞,暴力试试?
采用暴力穷举,需要确定字母a和字母b所映射的字符串。
那么怎么确定字母a和b?na,nb=pattern.count('a'),pattern.count('b')
,na,nb分别表示pattern中a和b的数量,可以确定的是na*len(a)+nb*len(b)==len(value)
通过这个等式可以确定a,b的长度,进而可以确定a与b的映射,然后就是将pattern通过映射翻译出来然后和value对比了。
——————————————
主要思路就到这里,然后就需要考虑特殊情况了。
pattern==''
:这里可以考虑value是否为空,但是建议:if not pattern:return not value
- 字母a或b在pattern中不存在
- a与b的映射不能相等,但是a不存在或b不存在时就需要考虑如何确定a不存在或b不存在
算法
class Solution:
def patternMatching(self, pattern: str, value: str) -> bool:
if not pattern:return not value
n=len(value)
na,nb=pattern.count('a'),pattern.count('b')
for i in range(n+1):
a=i
if nb==0:
av=value[:a]
else:
b=(n-na*i)/nb
if b!=int(b):continue
b=int(b)
if na==0:
bv=value[:b]
else:
if pattern[0]=='a':
av=value[:a]
bv=value[pattern.find('b')*a:pattern.find('b')*a+b]
else:
bv=value[:b]
av=value[pattern.find('a')*b:pattern.find('a')*b+a]
tp=''
for j in pattern:
if j=='a':
tp+=av
else:
tp+=bv
try:
if bv==av:continue
except:
pass
if tp==value:return True
return False
这是在主体的基础上试错然后修改出来的,写日记时发现将特殊情况特殊处理会更好。
执行用时:44 ms, 在所有 Python3 提交中击败了64.36%的用户
内存消耗:13.7 MB, 在所有 Python3 提交中击败了100.00%的用户
class Solution:
def patternMatching(self, pattern: str, value: str) -> bool:
if not pattern:return not value
n=len(value)
na,nb=pattern.count('a'),pattern.count('b')
if not na:
b=n/nb
if b!=int(b):return False
else:b=int(b)
return value[:b]*nb==value
elif not nb:
a=n/na
if a!=int(a):return False
else:a=int(a)
return value[:a]*na==value
for i in range(n+1):
a=i
b=(n-na*i)/nb
if b!=int(b):continue
b=int(b)
if pattern[0]=='a':
av=value[:a]
bv=value[pattern.find('b')*a:pattern.find('b')*a+b]
else:
bv=value[:b]
av=value[pattern.find('a')*b:pattern.find('a')*b+a]
if av==bv:continue
tp=''
for j in pattern:
if j=='a':tp+=av
else:tp+=bv
if tp==value:return True
return False