LeetCode——686. 重复叠加字符串匹配

题目描述

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

举个例子,A = “abcd”,B = “cdabcdab”。

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

注意:

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

思路:

每重叠一次字符串A,判断字符串B是否为其子串,若是,则返回重叠次数,否则,判断循环跳出条件

public class Test686 {
    public int repeatedStringMatch(String A, String B) {
        //记录重叠的次数
        int count = 1;
        String Atemp = A;
        while(true){
            //返回字符串B在Atemp中第一次出现的索引,若找不到,则返回-1
            int temp = Atemp.indexOf(B);
            if (temp != -1){
                return count;
                //关键在于找到下面跳出循环的条件
                /**
                 * 在B的长度大于A长度时且能够满足题意A叠加后B成为其子串的,总共只有四种情况
                 * 叠加n个A后刚好与B完全相等,例如A = 'ab', B = 'abab',此时刚好只需要循环n次即可满足条件,循环更多次也只是重复无用功
                 * 叠加n个A后与B的后部分完全相等,但此时B头部还有一小部分值刚好是A尾部分,例如A = 'ab', b = 'babab',此时最少需要循环n + 1次才可满足条件
                 * 同上一条,但多余部分出现在B的尾部,例如A = 'ab', b = 'ababa',此时最少需要的循环次数同上
                 * 同上,多余部分在B的头尾都有,例如A = 'ab', b = 'bababa',此时最少需要的循环次数为n + 2次
                 * 由上面的所有情况分析得到最少需要循环的次数为n + 2次,n为正整数,
                 * 转化为最小需要的长度S就是S >= (n + 2) * A.length,因为n = B.length / A.length,所以S >= B.length + A.length * 2
                 */
            }else if (Atemp.length() >((2*A.length())+B.length()) ){
                break;
            }
            Atemp = Atemp+A;
            count++;
        }
        return -1;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值