【力扣】面试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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章