leetcode刷题5:重复叠加字符串匹配

    技术2022-07-10  149

    题目:重复叠加字符串匹配

    给定两个字符串 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

    效果:

    Processed: 0.009, SQL: 9