【力扣】面試16.18:模式匹配

題目描述

你有兩個字符串,即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對比了。

——————————————
主要思路就到這裏,然後就需要考慮特殊情況了。

  1. pattern=='':這裏可以考慮value是否爲空,但是建議:if not pattern:return not value
  2. 字母a或b在pattern中不存在
  3. 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章