題目描述
你有兩個字符串,即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