快乐水题686. 重复叠加字符串匹配

Posted 谁吃薄荷糖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快乐水题686. 重复叠加字符串匹配相关的知识,希望对你有一定的参考价值。

原题:

力扣链接:686. 重复叠加字符串匹配

题目简述:

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

注意:字符串 “abc” 重复叠加 0 次是 “”,重复叠加 1 次是 “abc”,重复叠加 2 次是 “abcabc”。

解题思路

审题提炼

1.匹配子串,使用find函数实现子串查找;
2.然后循环叠加,找到退出循环的判据(这步倒腾很久都没倒腾出来,哎,提交了好几次都失败了),实现找不到子串的情况的退出;

波折心路(地铁上手机刷题):

1.自己的退出循环的判据一直错,捣鼓半天一直错,最后没办法,只能直奔题解区了。
2.看了官方的题解云里雾里,和我的方法有出入啊,于是又翻了翻,最终找到了和我思路类似的大佬的题解。看了大佬的题解豁然开朗,果断运行一波,如丝般润滑。
3.奉上大佬链接:
关键是找到循环终止条件

如果n个A字符串能包含B字符串,可能有几种情况:
1、A = “ab”, B = “abab”,循环n个A,刚好包含B;
2、A = “ab”, B = “ababa”,那么需要循环n + 1次;
3、A = “ab”, B = “babab”,那么需要循环n + 1次;
4、A = “ab”, B = “bababa”,那么需要循环n + 1次;
如果B不满足以上情况,A再怎么循环也是白搭,比如,A = “ab”, B = “bababb”,循环多少次都只是浪费。
因此,如果B能够在A的N次循环中被找到,最多只需要循环n+2次。循环终止条件就是累积的字符串长度 > (n + 2) * sizeA = (sizeB/sizeA + 2) * sizeA= sizeB + 2*sizeA.

4.over;

C++代码:

class Solution 
public:
    int repeatedStringMatch(string a, string b) 

        int na = a.size();
        int nb = b.size();

        string aa;
        int naa = 0;

        int i = 0;

        while(1)
        
            if(aa.find(b) != -1)
            
                return i;
            

            i++;
            aa += a;

            naa =aa.size();

            if(naa > 2*na + nb)
                return -1;
         

    return -1;
    
;

力扣结果展示:

以上是关于快乐水题686. 重复叠加字符串匹配的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode每日一题——686. 重复叠加字符串匹配

LeetCode - 686 -重复叠加字符串匹配 -Java

Leetcode 686.重复叠加字符串匹配

Python|Leetcode《686》|重复叠加字符串匹配

LeetCode 686. 重复叠加字符串匹配 / 1044. 最长重复子串(字符串哈希) / 1705. 吃苹果的最大数目

LeetCode 686. 重复叠加字符串匹配 / 1044. 最长重复子串(字符串哈希) / 1705. 吃苹果的最大数目