同步保存一下。。。
解题思路
这还叫中等难度???
再次照题解:
分类讨论: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