题目:重复叠加字符串匹配
给定两个字符串 A 和 B, 寻找重复叠加字符串A的最小次数,使得字符串B成为叠加后的字符串A的子串,如果不存在则返回 -1。
注意:
A 与 B 字符串的长度在1和10000区间范围内。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/repeated-string-match
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例:
举个例子,A = "abcd",B = "cdabcdab"。
答案为 3, 因为 A 重复叠加三遍后为 “abcdabcdabcd”,此时 B 是其子串;A 重复叠加两遍后为"abcdabcd",B 并不是其子串。
想法:
这题我刚拿到手的时候,看到简单题,提交的次数却是达到了通过次数的三倍,就感觉可能藏有玄机。
这个题的思路还是挺明显的,如果A比B要长或相等,那么直接就可以进行判断,若A中不包含B,那么叠加A,再判断。如果A比B短,那么就优先叠加A,直到A的长度大于或等于B,进行判断。不断给A字符串叠加A的操作,然后判断B是不是在A中,但是这个困扰我的问题就在于,什么时候停止这个对A不断累加A的循环。
我在判断这个停止的时机的时候,隐约有一种要找到最小公倍数的感觉,就是啥时候A的长度成为了B的两倍,就停止,但是结果却超时了,就只好转换思路,考虑A和B本身的长度关系。
我就定义了一个mul_a的字符串对象,用来存在重复叠加的A,我发现,当mul_a的长度,达到b的长度再加一个a的长度之后,若不存在,则再长也不可能存在包含关系,所以,结束的时机就在于当mul_a的长度小于a+b的长度之时。
解法:
class Solution(object):
def repeatedStringMatch(self, A, B):
"""
:type A: str
:type B: str
:rtype: int
"""
a_len = len(A)
b_len = len(B)
mul_a = A
mul = 1
while True:
if B in mul_a:
return mul
if (b_len + a_len) < len(mul_a):
return -1
mul_a = mul_a +A
mul += 1