leetcode-686-Repeated String Match(重复多少次A能够找到B)

题目描述:

Given two strings A and B, find the minimum number of times A has to be repeated such that B is a substring of it. If no such solution, return -1.

For example, with A = "abcd" and B = "cdabcdab".

Return 3, because by repeating A three times (“abcdabcdabcd”), B is a substring of it; and B is not a substring of A repeated two times ("abcdabcd").

Note:
The length of A and B will be between 1 and 10000.

 

要完成的函数:

int repeatedStringMatch(string A, string B) 

 

说明:

1、给定两个字符串A和B,要求判断需要重复A几次,才能在A中找到B,也就是使B成为A的子串。返回重复的最小次数。

2、这道题题意清晰,解决题目的关键在于把可能的情况想清楚。

本题分为三种情况处理:

① A比B短,这是最容易想到的情况,比如A为“abc”,B为“bcab”,我们要重复1次,使得A的长度大于等于B。接着猜判断B能不能在A中找到,这时我们用find函数即可。

  还有另一种情况,A重复完之后刚好长度等于B,但是我们有时能找到B,有时还要再重复一次才能找到B。

     比如A为“abc”,B为“abcabc”,这种就是重复1次,长度刚好等于B,能找到B的情况。

     比如A为“abc”,B为“bcabca”,这种就是重复1次,长度刚好等于B,但不能找到B的情况,要再重复1次。

 

② A比B长,有两种情况,第一种就是刚好能找到,不用重复。比如A为“abcdefg”,B为“bcd”。

  另一种是找不到,要再重复一次,比如A为“abcdefg”,B为“efga”,要再重复一次才能找到。

 

③ A和B一样长,同样两种情况,第一种就是刚好能找到,A==B

     另一种就是要再重复一次,比如A为“abcdefg”,B为“efgabcd”,要再重复一次才能找到。

 

综上所述,我们使得A的长度大于等于B,如果这个时候能找到B,那么ok,返回重复的次数。

如果不能找到B,那么再重复一次A,如果重复之后能找到,那么返回新的重复的次数。

如果还是找不到,我们认为当A的长度大于等于B的时候,这时候可能还会找不到B,但如果再重复一次A,重复之后还是找不到B,那么就是不可能通过重复A来找到B的,返回-1。(这一点不认同的同学们可以自己再想一想,有问题欢迎在下方评论区交流)

 

代码如下:(附详解)

    int repeatedStringMatch(string A, string B) 
    {
        string newA;
        int count=0;
        while(newA.size()<B.size())//重复A使得newA的长度大于等于B
        {
            newA+=A;
            count++;//记录重复的次数
        }
        if(newA.find(B)!=-1)//如果找得到,返回重复次数
            return count;
        newA+=A;//如果找不到,再重复一次A
        if(newA.find(B)!=-1)//如果找得到,返回新的重复次数
            return ++count;
        return -1;//如果还是找不到,返回-1
    }

上述代码实测17ms,beats 82.81% of cpp submissions。

posted @ 2018-06-15 17:01  chenjx85  阅读(491)  评论(0编辑  收藏  举报