LeetCode686.重复叠加字符串匹配

题目描述

给定两个字符串 A 和 B, 寻找重复叠加字符串A的最小次数,使得字符串B成为叠加后的字符串A的子串,如果不存在则返回 -1。

举个例子,A = "abcd",B = "cdabcdab"。

答案为 3, 因为 A 重复叠加三遍后为 “abcdabcdabcd”,此时 B 是其子串;A 重复叠加两遍后为"abcdabcd",B 并不是其子串。

注意:

 A 与 B 字符串的长度在1和10000区间范围内。

 

解题思路

不断将字符串A叠加,叠加结果记为t,当t的长度大于等于B的时候,开始找t中是否有B这个子串存在。

什么时候停止呢?也就是说到什么时候可以判定t中不存在B子串?

如果B是n个A叠加之后的一个子串,那么最极端的情况也就是B的头部是A的后面一部分,B的尾部是A的前面一部分,比如:

A = "abc" ; B=  "cabcabca"; 

那么当A叠加到B的长度再加上A长度的两倍的时候就可以判断了;当 n * lenA > lenB + 2 * lenA的时候,t中都找不到B这个子串,那么就可以返回-1.

当t = abcabcabc   长度为9的时候,可以找是否存在B,这个时候不存在,t的长度<  lenB + 2 * lenA

当t = abcabcabcabc   长度为12的时候,找到了B,长度小于lenB + 2*lenA = 14;可以返回叠加次数了;

如果没有找到,当再继续叠加的时候,超过了lenB + 2*lenA = 14,就可以返回-1了。

 

AC代码

class Solution {
public:
    int repeatedStringMatch(string A, string B) {
        int count = 1, lena = A.size(), lenb = B.size();
        string t = A;
        while (count * lena <= 2 * lena + lenb)
        {
            if(count * lena >= lenb)
                if(t.find(B) != string::npos)
                    return count;
            t += A;
            count++;
        }
        return -1;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值