KMP算法,686. 重复叠加字符串匹配,

news2024/11/17 1:26:35

首先,要明白,如果b串的第一个字母b[0]在a串中没有找到,那么不管a串复制多少次,b串都不会是a的子串。

如果b串的第一个字母b[0]在a串中能找到,那么我们看一下a串需要复制几次呢?

总结,可以发现这四种情况是可以合并在一起写的,即a串最多复制b/2+2次,这也是一些题解为什么说a串最多复制b/2+2次。

第一种方法,用切片的方法判断b串是否是a串的子串

class Solution:
    def repeatedStringMatch(self, a, b):
        la=len(a)
        lb=len(b)
        flag=[]
        for i in range(la):
            if a[i]==b[0]:
                #将a中b[0]出现的位置保存,因为
                #比如a="aac" b="ac"
                #不一定第一次匹配到的就恰好合适
                flag.append(i)
            else:
                i+=1
        if len(flag)==0:
            return -1
        else:
            s=a
            cnt=1
            for i in flag:
                while len(s)-i<lb:
                      s+=a
                      cnt+=1
                if s[i:i+lb]==b:
                    return cnt
            return -1

a=Solution()
print(a.repeatedStringMatch("abc", "cabcabca"))




第二种方法KMP算法

首先要知道KMP算法的思想

朴素模式匹配,就是暴力,从主串第一个位置看能否匹配,然后看第二个,如此进行下去

 然后去看【天勤考研】KMP算法易懂版_哔哩哔哩_bilibili

再去看 KMP算法之求next数组代码讲解_哔哩哔哩_bilibili

 

 

构造好next数组就是匹配的过程了

代码如下

class Solution:
    def repeatedStringMatch(self, a, b):
        b=' '+b#加个空格,模式串整体右移
        lb = len(b)
        next=[0]*lb
        next[1]=0#模式串1号位不匹配,把它置0
        i,j=1,0
        #i表示当前位上一位next数组的值
        #j表示最长公共前缀的下一位
        #构造next数组
        while i<(lb-1):
            #lb-1是因为,比如abc
            #i=2时就把next[3]算出来了
            if j==0 or b[i]==b[j]:
                i+=1
                j+=1
                next[i]=j
            else:
                j=next[j]
                '''
                j=0,特判,1号位与主串的下一位比较
                '''
        #求模式串在主串第一次出现的位置
        i,j=0,1
        while i<len(a):
            if j==0:#特判,j==0,是模式串的1号位与主串下一位比较
                i+=1
                j+=1
            elif i< len(a) and a[i]==b[j]:#匹配成功
                if j==(lb-1):
                    return i - j + 1
                i += 1
                j += 1
            else:
                j=next[j]
            if i< len(a) and a[i]==b[j] and j==(lb-1):
                return i-j+1
        return -1

如果你发现next数组的初始值有好几种,那么到底哪个对呢?

可以看帮你把KMP算法学个通透!(求next数组代码篇)_哔哩哔哩_bilibili

解决你的疑惑

最后回归本题代码

 

class Solution:
    def repeatedStringMatch(self, a, b):
        flag=len(b)//len(a)+1
        b=' '+b#加个空格,模式串整体右移
        lb = len(b)
        next=[0]*lb
        next[1]=0#模式串1号位不匹配,把它置0
        i,j=1,0
        #i表示当前位上一位next数组的值
        #j表示最长公共前缀的下一位
        while i<(lb-1):
            #lb-1是因为,比如abc
            #i=2时就把next[3]算出来了
            if j==0 or b[i]==b[j]:
                i+=1
                j+=1
                next[i]=j
            else:
                j=next[j]
                '''
                j=0,特判,1号位与主串的下一位比较
                '''
        s = a
        for i in range(flag):
            s+=a
        i, j = 0, 1
        while i < len(s):
            if j == 0:
                i += 1
                j += 1
            elif i < len(s) and s[i] == b[j]:  # 匹配成功
                if j == (lb - 1):
                    return i//len(a)+1
                i += 1
                j += 1
            else:
                j = next[j]
            if i < len(s) and s[i] == b[j] and j == (lb - 1):
                return i//len(a)+1
        return -1






本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/107792.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库系统概论第六章(关系数据理论)知识点总结(3)—— 范式知识点总结

本专栏收录了数据库的知识点&#xff0c;而从本文起&#xff0c;将讲述有关于关系数据理论中的第一范式、第二范式、第三范式以及BC范式有关知识点&#xff0c;提供给有需要的小伙伴进行学习&#xff0c;本专栏地址可以戳下面链接查看 &#x1f388; 数据库知识点总结&#xff…

windows CMD “ZEBAR ZPL 命令打印“驱动打印机

一、命令预览 copy WS20_8891898136BB520221221003.txt "\\10.165.98.33\IP-print-ZDesigner ZT411-203dpi ZPL" 二、难点打印机名称 1. copy 命令必须为共享打印机&#xff0c;及打印机共享名称&#xff0c;可以参考(163条消息) 发送ZPL指令到斑马打印机&#xff…

【Java对象拷贝机制】「实战开发专题」高性能使用CGlib实现Bean拷贝(BeanCopier)指南

对象拷贝现状 业务系统中经常需要两个对象进行属性的拷贝&#xff0c;不能否认逐个的对象拷贝是最快速最安全的做法&#xff0c;但是当数据对象的属性字段数量超过程序员的容忍的程度&#xff0c;代码因此变得臃肿不堪&#xff0c;使用一些方便的对象拷贝工具类将是很好的选择…

训练seq2seq模型的一些Tips——李宏毅机器学习笔记

Copy Mechanism 有时我们并不需要decoder创造一些东西出来&#xff0c;有些内容是可以从encoder复制而来。 最早具有复制能力的模型&#xff1a;Pointer Network 例如&#xff1a; chat-bot Summarization 至少要训练百万篇文章 Guided Attention Monotonic Attention Lo…

PPT怎么转化成PDF?这两种方法教你快速解决!

今天我们将向您介绍如何将 PowerPoint 演示文稿 (PPT) 转换为 PDF 文件。 我们将通过两种方法来做到这一点&#xff1a; 将 PowerPoint 演示文稿另存为 PDF 文件。使用 奇客免费PDF转换 将 PowerPoint 演示文稿转换为 PDF。方法一&#xff1a;使用 Microsoft PowerPoint 将 P…

合理利用chatGpt之新冠阳性

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;合理利用chatGpt之新冠阳性 ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加入:…

AI 预测到了正确的世界杯胜利者吗 ?

在过去的一个月里&#xff0c;卡塔尔 2022 年世界杯让我们目睹了一个又一个令人震惊的结果&#xff0c;甚至在决赛之前&#xff0c;让所有人的目光都聚焦在法国和阿根廷两支球队上&#xff0c;其实在球迷们心中&#xff0c;早就开始了各种猜测。&#x1f604;现在是时候回顾一下…

基于CNN和LSTM的气象图降水预测示例

我们是否可以通过气象图来预测降水量呢&#xff1f;今天我们来使用CNN和LSTM进行一个有趣的实验。 我们这里使用荷兰皇家气象研究所(也称为KNMI)提供的开放数据集和公共api&#xff0c;来获取数据集并且构建模型预测当地的降水量。 数据收集 KNMI提供的数据集&#xff0c;我…

excel函数公式大全,最常用的6个公式

Excel中的函数引用一些预定义的公式&#xff0c;可以通过输入参数值来计算函数的对应函数&#xff0c;并且函数名称基本上与函数相对应&#xff0c;这很容易记住。在日常工作中&#xff0c;功能可用于数据统计、计算、处理和分析。本文主要介绍EXCEL中一些常用公式&#xff0c;…

视唱练耳训练小程序开发,摆脱传统训练制约性

视唱练耳作为一门综合性的音乐基础理论学科&#xff0c;对于声乐、器乐、舞蹈等音乐学科中的各个方面都起着十分重要的作用&#xff0c;尤其是突出表现在基本理论、基本技能和音乐审美上&#xff0c;对培养和发展学生的乐感、唱奏技巧以及音乐思维等都有着非常重要的意义。世界…

Databend 开源周报 #71

Databend 是一款强大的云数仓。专为弹性和高效设计&#xff0c;自由且开源。 即刻体验云服务&#xff1a;https://app.databend.com。 What’s New 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 Features & Improvements Planner 优化集群模…

简单易用的监控告警系统 | HertzBeat 在 Rainbond 上的使用分享

在现有的监控告警体系中 Prometheus AlertManger Grafana 一直是主流&#xff0c;但对于中小团队或个人来说&#xff0c;这种体系显的较为复杂。而 HertzBeat 能让中小团队或个人很快速的搭建监控告警系统&#xff0c;并通过简单的配置实现应用、数据库、操作系统的监控与告警…

k8s HPA升级 KEDA 基于事件驱动的自动伸缩

说明&#xff1a;KEDA有啥用&#xff0c;相对HPA有啥优势。HPA针对于cpu,内存来进行弹性伸缩&#xff0c;有点不太精确。KEDA可以接入prometheus&#xff0c;根据prometheus的数据指标进行弹性伸缩&#xff0c;相比更加的精准实用。 安装k8s环境部署prometheus 创建ns&#xf…

HashMap最全面试题

文章目录一、 存储结构字段结构二、索引计算三、put方法四、扩容机制五、其他一、 存储结构 HashMap的底层数据结构是什么&#xff1f; 在JDK1.7 和JDK1.8 中有所差别&#xff1a; 在JDK1.7 中&#xff0c;由“数组链表”组成&#xff0c;数组是 HashMap 的主体&#xff0c;链…

Django学习Day6

1.ORM故障处理 1)当执行python manager.py makemigrations出现迁移问题时&#xff0c;如何进行解决。 处理方案&#xff1a;在models.py中&#xff0c;为book表的des非空字段设置一个默认值。 2&#xff09;数据库的迁移文件混乱问题 数据库中的django_migrations记录了migra…

健康指标管理系统

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 模块划分&#xff1a;公告类型、公告信息、地区信息、用户信息、人员分类、人员信息、指标信息、健康信息 管理员功能&a…

Java+MYSQL基于ssm在线投票管理系统

随着社会的发展,人们在处理一些问题的时候不同意见越来越多,这源于人们对思想的解放和对社会的认识。所以在处理同一问题上,为了征求不同人的意见在线投票系统诞生了。 传统的投票模式都是通过人工手动填写问卷的方式来进行,这在很大程度上会造成人力和资源上的浪费。随着科技的…

擎创技术流 | ClickHouse实用工具—ckman教程(7)

​ ​一期一会的“ckman”教程又跟大家见面了&#xff0c;本期分享的重点主要针对上期后台陆续收到的问题展开&#xff0c;解答完问题后再带入一些关于“ckman”升级的相关讲解。感兴趣的朋友可以先关注一波。还是老规矩&#xff0c;先带大家复习下前几期的分享内容↓↓↓ 擎创…

springboot整合mongodb 保姆级教程

1、确保mongodb是否安装 Linux安装docker 保姆级教程_ 来杯咖啡的博客-CSDN博客&#xff08;可以看这篇文章&#xff09; 2、代码展示 2.1 使用 MongoTemplate 创建boot项目&#xff0c;导入架包。 <?xml version"1.0" encoding"UTF-8"?> <p…

带你深入了解一下vue.js中的this.$nextTick!

我们先看看nextTick究竟是个啥&#xff1f; console.log(this.$nextTick); // 控制台打印 if(fn){return nextTick(fn, this); } 我们可以看出nextTick就是一个方法&#xff0c;方法有两个参数&#xff1a;fn和this&#xff0c;fn就是需要传的回调函数&#xff0c;this就是所…