zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    win 10打开administrator
    Navicat
    mkpasswd
    恢复不小心删除的文件
    mysql双主出现1602错误
    scp远程拷贝文件免密办法
    iredmail邮箱服务器部署
    keepalived+nginx后端服务器access_log出现127.0.0.1的访问记录
    lsof 简介
    Codeforces #536 div2 E (1106E)Lunar New Year and Red Envelopes (DP)
  • 原文地址:https://www.cnblogs.com/chenjx85/p/9188140.html
Copyright © 2011-2022 走看看