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

本文探讨了LeetCode中关于重复叠加字符串匹配的问题,分析了如何找到使字符串B成为叠加后字符串A子串的最小叠加次数。通过讨论不同情况和思考过程,提出了解决方案,并给出了实现效果。
摘要由CSDN通过智能技术生成

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

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

效果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值