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

news2024/9/21 5:41:51

重复叠加字符串匹配

  • leetcode 686. 重复叠加字符串匹配
    • 题目描述
    • KMP 算法
    • 代码演示
  • KMP 算法

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/repeated-string-match

题目描述

给定两个字符串 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

示例 4:
输入:a = “abc”, b = “wxyz”
输出:-1

提示:
1 <= a.length <= 10000
1 <= b.length <= 10000
a 和 b 由小写英文字母组成

KMP 算法

首先想明白一个问题,如果叠加后含有b,那么起始位置,一定是在a的某一个位置.
在这里插入图片描述

因此我们可以先复制出长度大于b字符串长度的字符串,然后根据kmp算法,看b是否是a叠加后的字串,就可以得出,得出需要复制的次数(在叠加时,记录叠加的次数).

代码演示

  /**
     * leetcode 686. 重复叠加字符串匹配
     * @param a
     * @param b
     * @return
     */
    public int repeatedStringMatch(String a, String b) {
        StringBuilder sb = new StringBuilder();
        int time = 0;
        //当长度大于b 的长度时,就退出
        while (sb.length() < b.length()){
            time++;
            sb.append(a);
        }
        sb.append(a);
        int indexOf = getIndexOf(sb.toString(), b);
        if (indexOf == -1){
            return -1;
        }
        return indexOf + b.length() > a.length() * time ? time + 1 : time;
    }

    /**
     * 判断s2 是否是 s1的子串. 返回出现的第一个字母的下标
     * @param s1
     * @param s2
     * @return
     */
    public  int getIndexOf(String s1, String s2) {
        if (s1 == null || s2 == null || s1.length() == 0 || s1.length() < s2.length()){
            return -1;
        }
        char[] str1 = s1.toCharArray();
        char[] str2 = s2.toCharArray();
        int[] next = getNextArray(str2);
        int x = 0;
        int y = 0;
        while (x < str1.length && y < str2.length){
            if (str1[x] == str2[y]){
                //相等时 去下一个位置去比较
                x++;
                y++;
            } else if (next[y] == -1) {
                x++;
            }else {
                y = next[y];
            }
        }
        return y == str2.length ? x - y : -1;
    }

    /**
     * 前缀和后缀相等的长度数组
     * @param str
     * @return
     */
    public int[] getNextArray(char[] str){
        if(str.length == 1){
            return new int[]{-1};
        }
        int n = str.length;
        int[] next = new int[n];
        next[0] = -1;
        next[1] = 0;
        int i = 2;
        int hc = 0;
        while (i < n){
            if (str[i - 1] == str[hc]){
                next[i++] = ++hc;
            } else if (hc > 0) {
                hc = next[hc];
            }else {
                next[i++] = 0;
            }
        }
        return next;
    }

KMP 算法

KMP–高效字符串匹配算法

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

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

相关文章

MySql存储引擎介绍——InnoDB、MyISAM、Memory

文章目录 1.MySql体系结构2.存储引擎简介3.存储引擎的特点3.1 InnoDB存储引擎特点3.2 MyISAM存储引擎介绍3.3 Memory存储引擎介绍 4.三种存储引擎的特点5.存储引擎的选择6.小结 1.MySql体系结构 2.存储引擎简介 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式…

python接口自动化(二十四)--unittest断言——中(详解)

简介 上一篇通过简单的案例给小伙伴们介绍了一下unittest断言&#xff0c;这篇我们将通过结合和围绕实际的工作来进行unittest的断言。这里以获取城市天气预报的接口为例&#xff0c;设计了 2 个用例&#xff0c;一个是查询北京的天气&#xff0c;一个是查询 南京为例&#xf…

剑指offer55.二叉树的深度

这道题只要想到一棵树的最大深度 max(左子树的最大深度&#xff0c; 右子树的最大深度) 1&#xff1b;就能做出来&#xff0c;利用这个规律递归就出来了。 class Solution {int max,k 1;public int maxDepth(TreeNode root) {if(root null) return 0;return dfs(root);}pr…

【大数据趋势】7月9日 汇率,美澳,恒指期货的大数据趋势概率分析。

1. 数据源头之一 : 美元汇率 美元国债利息持续上行&#xff0c;美元承压&#xff0c;阶段性弱势是明显的。行情这个位置震荡许久&#xff0c;比较大概率能力不佳&#xff0c;有破位可能。从中期趋势来看&#xff0c;正在一个阶段性一层一层往下走的形态下&#xff0c;处于一次…

使用Gradio库创建交互式散点图

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

【二分查找】367. 有效的完全平方数

367. 有效的完全平方数 解题思路 使用二分查找查找区间是[1,num]针对mid * mid和num进行比较 然后更改查找区间 class Solution {public boolean isPerfectSquare(int num) {// 二分查找 // 区间就是[1,num.length]long left 1;long right num;long mid 0;while(left <…

高薪Offer收割机之Redis的数据持久化

Redis的数据持久化有两种方式:RDB和AOF 先来看第一种方式RDB持久化: RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照,简单的说就是把内存中所有的数据都记录到磁盘中,当Redis服务器重启以后,从磁盘中读取文件恢复内存中的数据。 有两…

Windows平台软件工程关键路径PDM图

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来聊聊Windows平台下软件工程实践中涉及关键路径问题时常用的PDM图。 PDM图 我们用工程实例来完整讲解PDM图的节点表示&#xff0c; ES(最早开始时间) 、 LS(最迟开始时间)、EF(最早完成时间)、LF(最迟…

12 Java选择语句(switch)

1 选择语句常规用法 switch语法如下&#xff1a; swicth(输入的变量){ case 1 : //如果变量等于1 System.out.println("星期一"); break; case 2 : //如果变量等于2 System.out.println("星期二"); break; default: // 如果变量不是1和2 System.out.pr…

【Python】Python项目打包发布(五)(制作Windows安装包)

Python项目打包发布汇总 【Python】Python项目打包发布&#xff08;一&#xff09;&#xff08;基于Pyinstaller打包多目录项目&#xff09; 【Python】Python项目打包发布&#xff08;二&#xff09;&#xff08;基于Pyinstaller打包PyWebIO项目&#xff09; 【Python】Pytho…

学生成绩管理系统实现(CSS+JQuery+PHP+MySQL)

学生成绩管理系统实现&#xff08;CSSJQueryPHPMySQL&#xff09; 一、项目背景 本项目基于学校教务系统的背景&#xff0c;根据大学生选课以及学校对学生成绩的管理&#xff0c;实现了一个学校的学生成绩管理网站。另外在学生功能模块实现了选课系统&#xff0c;可供学生选课…

Ext4文件系统介绍 - 理论篇

Overview ext4文件系统分割成多个block groups&#xff0c;为了解决碎片化问题&#xff0c;block allocator尽量将一个文件的block放在一个group中。block groups的size通过sb.s_blocks_per_group指定&#xff0c;同样也可以通过8*block_size_in_bytes计算得到。block默认大小…

【Zookeeper】终端操作常用命令

文章目录 服务端常用命令客户端常用命令 zookeeper版本3.7.1 Zookeeper是一个开源的分布式协调服务。 Zookeeper是Apache软件基金会的一个项目&#xff0c;它提供了分布式应用程序协调的通用服务&#xff0c;如分布式同步、命名服务、集群维护等&#xff0c;以简化分布式应用协…

【计算机组成与体系结构Ⅰ】实验6 熟悉Vivado及MINISYS-1实验系统

一、实验目的 1&#xff1a;熟悉Vivado的开发环境及开发流程&#xff0c;掌握Vivado中Verilog HDL文本输入设计方法&#xff0c;包括仿真、综合、实现与下载。熟悉Minisys开发板的功能和使用方法。 2&#xff1a;学会可配置IP核的设计与封装方法&#xff0c;深入理解与门逻辑…

Linux驱动入门(五)——简单的字符设备驱动程序

文章目录 前言字符设备驱动程序框架字符设备和块设备主设备号和次设备号申请和释放设备号 初识cdev结构cdev结构体file_operations结构体cdev和file_operation结构体的关系inode结构体 字符设备驱动的组成字符设备加载和卸载函数file_operations结构体和其他成员函数驱动程序与…

Tomcat面试题

江湖无名 安心练剑 关注微信公众号&#xff1a;程序三两行 获取最新版面试资料、java学习路线 1、Tomcat 的缺省端口是多少&#xff0c;怎么修改&#xff1f; 1&#xff09;找到 Tomcat 目录下的 conf 文件夹 2&#xff09;进入 conf 文件夹里面找到 server.xml 文件 3&…

Elasticsearch】文档操作

目录 3.文档操作 3.1.新增文档 3.2.查询文档 3.3.删除文档 3.4.修改文档 3.4.1.全量修改 3.4.2.增量修改 3.5.总结 3.文档操作 3.1.新增文档 语法&#xff1a; POST /索引库名/_doc/文档id {"字段1": "值1","字段2": "值2"…

AUTOSAR CP标准的RTE和BSW各模块的设计及开发工作

AUTOSAR&#xff08;Automotive Open System Architecture&#xff09;是一种开放的汽车电子系统架构标准&#xff0c;旨在提供一种统一的软件架构&#xff0c;以实现汽车电子系统的模块化和可重用性。 AUTOSAR标准中的两个重要模块是RTE&#xff08;Runtime Environment&…

YOLOV5/V7动态多Batch推理,GPU预处理、后处理C++源码

YOLO系列多batch处理后处理代码&#xff0c;C代码&#xff0c;结构清晰&#xff0c;自己后期会继续发布真实场景项目&#xff1b;关注公众号欢迎下载。 一、获取链接 所有源码获取方法&#xff0c;链接&#xff1a;https://www.cnblogs.com/shenduxuexizahuopu/p/17538815.htm…

【LeetCode】HOT 100(22)

题单介绍&#xff1a; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的题目&#xff0c;适合初识算法与数据结构的新手和想要在短时间内高效提升的人&#xff0c;熟练掌握这 100 道题&#xff0c;你就已经具备了在代码世界通行的基本能力。 目录 题单介绍&#…