LeetCode面试题 16.18. 模式匹配

同步保存一下。。。

解题思路

这还叫中等难度???
再次照题解:
分类讨论:1.pattern为空,则只有value为空时为true,否则false;
2.当value为空时,如果pattern中既有a也有b则为false,否则为true;
3.当二者都不为空,如果pattern只有a或者只有b,如果value能整除pattern的个数,并且每个子串都一样则为true,否则为false;
4.当二者都不为空,且pattern中既有a也有b,则统计ab个数,如果其中一个个数为1,则可以把其当做value,另一个为‘’,返回true;
5.二者都不为空,且pattern中a和b的个数都大于1,这就最最麻烦了,遍历所有a可能的字符串长度,确定对应的b字符串长度,按照pattern走一遍,用set分别统计ab对应的子串,如果最后两个set都只有一个元素且value刚好遍历完,则返回true,如果a对应的所有长度都找不到对应匹配,则最后返回false。
时间 O ( l v 2 ) O({l_v}^2) O(lv2) a的每个长度都遍历一遍,每次遍历都要遍历value
空间 O ( l v ) O(l_v) O(lv) 需要存储a和b的子串,长度之和不超过value长度

代码

class Solution:
    def patternMatching(self, pattern: str, value: str) -> bool:
        if pattern=='':
            return value==''
        elif value=='':
            if 'a' in pattern and 'b' in pattern:
                return False
            else:
                return True
        elif len(set(pattern))==1:
            if len(value)%len(pattern)!=0:
                return False
            else:
                l=len(value)//len(pattern)
                sub=value[0:l]
                for i in range(1,len(pattern)):
                    if value[l*i:l*(i+1)]!=sub:
                        return False
                return True
        else:
            ca=pattern.count('a')
            cb=pattern.count('b')
            if ca==1 or cb==1:
                return True
            for i in range(len(value)//ca):
                b_s=len(value)-i*ca
                j=b_s//cb
                set_a=set()
                set_b=set()
                p=0
                for c in pattern:
                    
                    if c=='a':
                        set_a.add(value[p:p+i])
                        p+=i
                    else:
                        set_b.add(value[p:p+j])
                        p+=j
                if len(set_a)==1 and len(set_b)==1 and p==len(value):
                    return True
            return False

            
            
        

        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值