686. 重复叠加字符串匹配

2021.12.22LeetCode每日一题——重复叠加字符串匹配 目录 重复叠加字符串匹配 描述 示例 1 示例 2 示例 3 示例 4 提示 方法一:暴力 方法二:Rabin-Karp 算法 方法三:KMP算法 重复叠加字符串匹配 描述 给定两个字符串a 和 b,寻找重复叠加字符串 a 的最小次数,使得字符串 b 成为叠加后的字符串 a 的子串,如果不存在则返回 -1。 注意:字符串 "abc"重复叠加 0 次是 "",重复叠加 1 次是"abc",重复叠加 2 次是"abcabc"。 示例 1 输入:a = "abcd"... 阅读详情

686. 重复叠加字符串匹配

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

注意:字符串 "abc" 重复叠加 0 次是 "",重复叠加 1 次是 "abc",重复叠加 2 次是 "abcabc"。
示例 1:

输入:a = "abcd", b = "cdabcdab"
输出:3
解释:a 重复叠加三遍后为 "abcdabcdabcd", 此时 b 是其子串。
示例 2:

输入:a = "a", b = "aa"
输出:2
示例 3:

输入:a = "a", b = "a"
输出:1

自己的解题思路

首先,如果a中缺少b中的元素,那么无论a怎么重复b必定不能是a的子串。

那么如果a重复以后b是a的子串,那么第一个b的第一个元素就应该开始能够匹配的到

也就是 abcd中第一个b的元素c开始 cdabcdab刚好匹配到,从而计算出答案,代码如下

class Solution {
public:

    int Isok(int index, string& a, string& b) {  // 函数的作用是判断当前index是否满足条件
        int ans = 1;
        index--;
        for(int i=0;i<b.size();i++) {
            // int index_a = (index+1);
            index++;
            if(index>=a.size()) {
                ans++;
                index%=a.size();
            }
            if(a[index]!=b[i]) {
                return -1;
            }
        }
        return ans;
    }


    int repeatedStringMatch(string a, string b) {
        /* 
            分析,也就是两个字符串 a b 寻找的是,b成为a重叠后的子串。
            首次子串的概念就是,连续的,一致的,并不同于子序列
            首先,重叠以后变成子串必须满足以下的条件
            1. a中必须是b中开头的元素 abcd通过调整顺序就成了 cd开头的
         */

         unordered_map<char,vector<int>> mp;  // vector是为了防止有相同的字符。
         for(int i=0;i<a.size();i++) {
             mp[a[i]].push_back(i);  // 记录的是字符出现的位置,
         }
        
         int ans= -1;
         if(mp.find(b[0])==mp.end()) {
             return ans;
         }

         for(auto index : mp[b[0]]) {
             int tmp = Isok(index,a,b);
             if(tmp>0) {
                 if(ans==-1) {
                     ans=tmp;
                     return ans;
                 } else {
                     ans=min(ans,tmp);
                 }
             }
            //  cout<<ans<<endl;
         }
        

        return ans;

    }
};

参考别人别人解题思路

首先,可以分析复制次数的「下界」和「上界」为何值:

对于「下界」的分析是容易的:至少将 a 复制长度大于等于 b 的长度,才有可能匹配。

在明确了「下界」后,再分析再经过多少次复制,能够明确得到答案,能够得到明确答案的最小复制次数即是上界。

由于主串是由 a 复制多次而来,并且是从主串中找到子串 b,因此可以明确子串的起始位置,不会超过 a 的长度。

由此,我们可知复制次数「上界」最多为「下界 + 11」。

令 a 的长度为 nn,b 的长度为 mm,下界次数为 c1,上界次数为 c2 = c1 + 1。

因此我们可以对 a 复制 c2 次,得到主串后匹配 b,如果匹配成功后的结束位置不超过了 n * c14,说明复制 c1 即可,返回 c1,超过则返回 c2;匹配不成功则返回 -1。

class Solution {
public:
    int repeatedStringMatch(string a, string b) {
        int m = a.size(), n = b.size();
        //b如果有a没有的字符串,则返回-1
        vector<int> alpha(26);
        vector<int> start;//b[0]在a中的所有位置
        for(int i = 0;i < m;i++)
        {
            alpha[a[i]-'a']++;
            if(a[i] == b[0]){
                start.push_back(i);
                // printf("i:%d\n", i);
            }
        }
        for(auto &c: b)
            if(!alpha[c-'a']) return -1;

        //a复制后长度必须不比b短才行
        //思路:字符串哈希,记录a中b开头字母的位置
        //a最大复制长度为b的两倍
        //为了节省空间采用循环
        int res = (n+m-1)/m;
        int len_a = (n+m-1)/m * m;
        bool flag = false;
        int cnt = 2;
        while(cnt--)
        {
            for(auto &pos: start)
            {

                for(int i = pos; i + n - 1 < len_a;i += m){
                    flag = true;
                    for(int j = i;j <= n+i-1;j++)
                    {
                        // printf("i:%d,j:%d,a:%c,b:%c\n",i,j,a[j%m],b[j-i]);
                        if(a[j%m] != b[j-i]) {
                            flag = false;
                            break;
                        }
                    }
                    if(flag) break;
                }
                if(flag) break;
            }
            if(flag) return res;
            res += 1;
            len_a += m;
        }
        return -1;
    }
};

link

686.重复叠加字符串匹配 Tips:该专栏的题解整理在https://github.com/dzw001/leetcode_notebook,有需要的童鞋自取哦~ 题目链接 https://leetcode-cn.com/problems/repeated-string-match 题目描述 题目难度:中等 给定两个字符串 a和 b,寻找重复叠加字符串 a的最小次数,使得字符串 b成为叠加后的字符串 a的子串,如果不存在则返回 -1。 注意:字符串 "abc" 重复叠加 0 次是 "",重复叠加 1 次是&nbs 阅读详情

相关推荐

leetcode:686. 重复叠加字符串匹配

题目 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/day-of-the-year 给定两个字符串 a 和 b,寻找重复叠加字符串 a 的最小次数,使得字符串 b 成为叠加后的字符串 a 的子串,如果不存在则返回 -1。 注意:字符串 “abc” 重复叠加 0 次是 “”,重复叠加 1 次是 “abc”,重复叠加 2 次是 “abcabc”。 示例 1: 输入:a = “abcd”, b = “cdabcdab” 输出:3 解释:a 重复叠加三遍后

uncle_ll的博客 550

刷爆力扣之重复叠加字符串匹配

刷爆力扣记录 686 重复叠加字符串匹配

优质后端技术知识记录 690

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

686. 重复叠加字符串匹配 给定两个字符串 A 和 B, 寻找重复叠加字符串A的最小次数,使得字符串B成为叠加后的字符串A的子串,如果不存在则返回 -1。 举个例子,A = “abcd”,B = “cdabcdab”。 答案为 3, 因为 A 重复叠加三遍后为 “abcdabcdabcd”,此时 B 是其子串;A 重复叠加两遍后为”abcdabcd”,B 并不是其子串。 注意: A 与 B 字符串的长度在1和10000区间范围内。 class Solution { public int repeatedStringMatch(String A, String B) {

leetcode 686. 重复叠加字符串匹配(KMP算法-java)

因此我们可以先复制出长度大于b字符串长度的字符串,然后根据kmp算法,看b是否是a叠加后的字串,就可以得出,得出需要复制的次数(在叠加时,记录叠加的次数).给定两个字符串 a 和 b,寻找重复叠加字符串 a 的最小次数,使得字符串 b 成为叠加后的字符串 a 的子串,如果不存在则返回 -1。注意:字符串 “abc” 重复叠加 0 次是 “”,重复叠加 1 次是 “abc”,重复叠加 2 次是 “abcabc”。输入:a = “a”, b = “aa”输入:a = “a”, b = “a”

SP_1024的博客 647

Lumerical FDTD新手必看:从零开始搭建光子晶体仿真环境(附完整脚本)

本文为Lumerical FDTD新手提供光子晶体仿真环境的完整搭建指南,涵盖从基础参数设置到脚本编写的全流程。通过典型光子晶体带隙分析案例,详细讲解结构建模、仿真参数配置及后处理技巧,并附赠完整MATLAB脚本,帮助用户快速掌握FDTD仿真核心技术。

3c4x5z6v7b的博客 1053

Python+QMT量化交易实战:从零搭建你的第一个极速策略(附完整代码)

本文提供了一份详细的Python+QMT量化交易实战指南,手把手教你从零搭建一个可回测、可实盘的极速策略。内容涵盖环境配置、QMT核心机制解析、双均线策略的完整代码实现、回测优化方法以及实盘部署要点,帮助量化交易新手快速入门并掌握核心开发流程。

b9c0d的博客 1014

140、重复叠加字符串匹配

题目描述: 给定两个字符串 A 和 B, 寻找重复叠加字符串A的最小次数,使得字符串B成为叠加后的字符串A的子串,如果不存在则返回 -1。 举个例子,A = “abcd”,B = “cdabcdab”。 答案为 3, 因为 A 重复叠加三遍后为 “abcdabcdabcd”,此时 B 是其子串;A 重复叠加两遍后为"abcdabcd",B 并不是其子串。 注意: A 与 B 字符串的长度在1和10...

qq_34446716的博客 272

CentOS 7环境下GLPI与OCS Inventory资产管理系统集成部署指南

本文详细介绍了在CentOS 7环境下,如何将GLPI与OCS Inventory两大开源工具进行集成部署,构建自动化资产管理系统。指南涵盖环境准备、核心服务安装、Web界面初始化、OCS插件配置及资产同步实战,帮助运维人员实现IT资产的自动发现、统一管理与可视化,大幅提升资产管理效率。

weixin_29274337的博客 327

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

Leetcode 686. 重复叠加字符串匹配 题目 给定两个字符串 A 和 B, 寻找重复叠加字符串A的最小次数,使得字符串B成为叠加后的字符串A的子串,如果不存在则返回 -1。 举个例子,A = “abcd”,B = “cdabcdab”。 答案为 3, 因为 A 重复叠加三遍后为 “abcdabcdabcd”,此时 B 是其子串;A 重复叠加两遍后为"abcdabcd",B 并不是其子串。 注意: A 与 B 字符串的长度在1和10000区间范围内。 题解 暴力,每次叠加A,然后用find函数是否含有

weixin_43750513的博客 258

实战指南:CentOS 7下VOS3000 8.0从零部署到授权激活全流程

本文提供了一份详尽的CentOS 7系统下部署VOS3000 8.0的实战指南。从环境准备、使用FileZilla上传安装包、执行自动化安装脚本,到获取软件码、利用注册机生成授权文件并激活,手把手带领用户完成从零部署到投入商用的全流程,确保系统稳定运行。

zero1的博客 896

海外跨境电商商城源码-进出口电商平台网站-多语言多商户平台

我们的海外跨境电商系统源码还包括各种功能模块,如用户管理、商品管理、订单管理等。支付管理:与主流支付平台(如Stripe、PayPal等)的集成,支持多种支付方式;订单管理:创建订单、支付订单、取消订单等操作,以及订单状态查询和历史记录;购物车管理:添加商品到购物车、查看购物车、修改购物车中的商品数量等操作;商品管理:商品信息录入、编辑、删除等操作,以及商品分类和搜索功能。客服管理:在线咨询、投诉处理等功能,提供更好的用户服务。用户管理:注册、登录、忘记密码、个人资料。# 检查电子邮件地址是否有效。

柏诣科技的博客 2661

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

原题: 力扣链接:686. 重复叠加字符串匹配 题目简述: 给定两个字符串 a 和 b,寻找重复叠加字符串 a 的最小次数,使得字符串 b 成为叠加后的字符串 a 的子串,如果不存在则返回 -1。 注意:字符串 “abc” 重复叠加 0 次是 “”,重复叠加 1 次是 “abc”,重复叠加 2 次是 “abcabc”。 解题思路 审题提炼 1.匹配子串,使用find函数实现子串查找; 2.然后循环叠加,找到退出循环的判据(这步倒腾很久都没倒腾出来,哎,提交了好几次都失败了),实现找不到子串的情况的退出;

谁吃薄荷糖 601

go语言实现服务器server端与客户client端即时通信(附完整源码)

go语言实现服务器server端与客户client端即时通信(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 627

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

**[LeetCode]686.重复叠加字符串匹配**题目示例方法直接计算 题目 给定两个字符串 a 和 b,寻找重复叠加字符串 a 的最小次数,使得字符串 b 成为叠加后的字符串 a 的子串,如果不存在则返回 -1。 注意:字符串 “abc” 重复叠加 0 次是 “”,重复叠加 1 次是 “abc”,重复叠加 2 次是 “abcabc”。 示例 示例一 输入: a = “abcd”, b = “cdabcdab” 输出:3 解释:a 重复叠加三遍后为 “abcdabcdabcd”, 此时 b 是其子串

qq_47875463的博客 173

深度学习论文: AnomalyDINO: Boosting Patch-based Few-shot Anomaly Detection with DINOv2

通过将DINOv2模型适应到一次性和少量异常检测中,并专注于工业应用少量异常检测。实验表明,这种方法不仅与现有技术相匹敌,甚至可以在许多设置中超越它们。我们提出的仅视觉方法AnomalyDINO基于补丁相似性,能够实现图像级别的异常预测和像素级别的异常分割。该方法在方法论上很简单,无需训练,因此不需要任何额外的数据进行微调或元学习。

mingo_敏 1904

[Dify实战] 合同审阅助手:识别风险条款、生成修改建议-带绑定资源

摘要: Dify合同审阅助手通过AI技术提升合同审阅效率,快速识别风险条款并输出结构化修改建议。方案包括合同输入、关键条款识别、风险评级和报告生成流程,重点关注付款、责任限制等核心条款。采用分层风险分级(高/中/低)和"红线清单"机制,确保审阅标准化。实施建议先建立条款库和模板,通过样本测试优化模型,定期更新规则库。该方案可缩短审阅时间50%以上,提高风险识别准确率,最终实现法务经验的可复用沉淀。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 597

leetcode:686. 重复叠加字符串匹配

代码】leetcode:686. 重复叠加字符串匹配。

OceanStar的博客 276

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

目录 题目: 思路: 代码: 代码解读 ​参考链接: 题目: 686. 重复叠加字符串匹配 思路: 刚刚好字符覆盖,或者差一个a字符 代码: class Solution: def repeatedStringMatch(self, a: str, b: str) -> int: return l if (a * (l:=ceil(len(b)/len(a)))).find(b) != -1 else l + 1 if...

heart_6662的博客 2618

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

LeetCode 686. 重复叠加字符串匹配(Repeated String Match)

686. 重复叠加字符串匹配 686. Repeated String Match 题目描述 给定两个字符串 A 和 B,寻找重复叠加字符串 A 的最小次数,使得字符串 B 成为叠加后的字符串 A 的子串,如果不存在则返回 -1。 举个例子,A = "abcd",B = "cdabcdab"。 答案为 3,因为 A 重复叠加三遍后为 "abcdabcdabcd",此时 B 是其子串;A 重复叠加两...

weixin_30455067的博客 147

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

leetcode-686:重复叠加字符串匹配

leetcode-686:重复叠加字符串匹配题目解题方法一: 题目 题目链接 给定两个字符串 a 和 b,寻找重复叠加字符串 a 的最小次数,使得字符串 b 成为叠加后的字符串 a 的子串,如果不存在则返回 -1。 注意:字符串 “abc” 重复叠加 0 次是 “”,重复叠加 1 次是 “abc”,重复叠加 2 次是 “abcabc”。 示例 1: 输入:a = "abcd", b = "cdabcdab" 输出:3 解释:a 重复叠加三遍后为 "abcdabcdabcd", 此时 b 是其子串。 示例

菊头蝙蝠的博客 404
上一篇: pkg-config到底是个啥
下一篇: Rabin-Karp算法(加速字符串匹配)
黑猫爱小鹿
博客等级 码龄8年 1万+粉丝 205原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值