该题解的思路是通过分情况讨论来解决问题。首先判断特殊情况,如果字符串b为空则返回0;如果字符串a的长度为1,则判断b是否完全由a组成,如果是则返回a在b中出现的次数,否则返回-1。接下来判断一般情况,如果b是a的子串,则直接返回1;如果a是b的子串,则统计a在b中出现的次数,并判断a之间的部分是否为空,以及b的开头和结尾是否能与a匹配,据此计算最小重复次数;如果b是两个a拼接而成的子串,则返回重复次数加2;其他情况返回-1。
时间复杂度: O(n)
空间复杂度: O(n)
class Solution:
def repeatedStringMatch(self, a: str, b: str) -> int:
# 如果字符串b为空,返回0
if b == "":
return 0
# 如果字符串a的长度为1
if len(a) == 1:
# 判断b是否完全由a组成
if b.replace(a,"") == "":
# 返回a在b中出现的次数
return b.count(a)
# 否则返回-1
return -1
# 如果b是a的子串,直接返回1
if b in a:
return 1
repeat_count = 0
# 如果a是b的子串
if a in b:
# 统计a在b中出现的次数
repeat_count = b.count(a)
# 将b按a拆分
remain = b.split(a)
# 判断a之间的部分是否为空
for i in range(1,len(remain)-1):
if remain[i] != "":
return -1
# 判断b的开头是否能与a的结尾匹配
if remain[0] != "":
if a.endswith(remain[0]):
repeat_count +=1
else:
return -1
# 判断b的结尾是否能与a的开头匹配
if remain[-1] != "":
if a.startswith(remain[-1]):
repeat_count +=1
else:
return -1
return repeat_count
# 如果b是两个a拼接而成的子串
if b in (a+a):
return repeat_count + 2
# 其他情况返回-1
return -1