KMP算法 Java实现

这篇具有很好参考价值的文章主要介绍了KMP算法 Java实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Problem: 28. 找出字符串中第一个匹配项的下标

目录
  • 解题方法
  • 思路
    • 构建next数组
    • 回溯查找
  • 复杂度
  • Code

解题方法

  1. 构建next串
  2. 回溯查找next串,最后下标

思路

  1. 通过最大前缀后缀能找到下一次未查找到后要回溯的位置

构建next数组

无论如何第一个数的下一次回溯位置肯定是0,因此next[0]=0
这里的 j表示前缀起始位置 i表示后缀起始位置
如果找到字符不相同到的话,就让他一直回溯找,并且回溯赋值j = next[j-1]
能找到相同字符的话就直接i++,j++,并且把next[i] = j
这里先写while判断不相同 后写相同,是因为不相同的终点
一定是有相同的后缀或者直接结束查找(到了字符串末尾)

回溯查找

其实和上面的思路差不多,不能查找相同字符就一直回溯,能的话就共同前进,直到j到了模式串长度
这时因为i也在前进,所以i的下标是 应该返回的下标+(匹配串的长-1)

复杂度

时间复杂度:

添加时间复杂度, 示例: $O(m+n)$

空间复杂度:

添加空间复杂度, 示例: $O(m)$文章来源地址https://www.toymoban.com/news/detail-854483.html

Code

class Solution {

    public int strStr(String haystack, String needle) {
        return new KMP(needle).search(haystack);
    }

    public class KMP {
        private String pattern;   // 模式串
        private int[] next;
        public KMP(String pattern){
            this.pattern = pattern;
            int m = pattern.length();
            // 创建next 数组
            next = new int[m];
            next[0] = 0;
            for(int i = 1,j=0; i < m; i++){
                while(j>0&&pattern.charAt(i)!=pattern.charAt(j)){
                    j = next[j-1];
                }
                if(pattern.charAt(i) == pattern.charAt(j)){
                    j++;
                }
                next[i] = j;
            }
        }

        public int search(String text){
            int j = 0;
            for(int i=0;i<text.length();i++){
                while(j>0&&text.charAt(i) != pattern.charAt(j)){
                    j = next[j-1];
                }
                if(text.charAt(i) == pattern.charAt(j)){
                    j++;
                }
                if(j == pattern.length()){
                    return i-pattern.length()+1;
                }
            }
            return -1;
        }
    }

}

到了这里,关于KMP算法 Java实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构--字符串的KMP算法

    朴素模式匹配算法: 一旦发现当前这个子串中某个字符不匹配,就只能转而匹配下一个子串(从头开始) 但我们可以知道: 不匹配的字符之前,一定是和模式串一致的 color{red}不匹配的字符之前,一定是和模式串一致的 不匹配的字符之前,一定是和模式串一致的 我们可以利用

    2024年02月12日
    浏览(64)
  • LeetCode:459. 重复的子字符串 —【2、KMP算法】

    🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀 算法专栏: 👉🏻123 题目描述 :给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。 来源:力扣(LeetCode) 难度: 简单 提示: 1 = s.length = 104 s 由小写英文字母组成 示例 1: 输入:

    2024年02月04日
    浏览(82)
  • 【数据结构】字符串匹配|BF算法|KMP算法|next数组的优化

    字符串匹配算法是在实际工程中经常遇到的问题,也是各大公司笔试面试的常考题目,本文主要介绍BF算法(最好想到的算法,也最好实现)和KMP算法(最经典的) BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标S的第一个字符与模式串T的第一

    2024年02月04日
    浏览(56)
  • 华为OD机试真题 Java 实现【在字符串中找出连续最长的数字串】【2023 B卷 100分】,附详细解题思路

    输入一个字符串,返回其最长的数字子串,以及其长度。 若有多个最长的数字子串,则将它们全部输出(按原字符串的相对位置)。 本题含有多组样例输入。 数据范围: 字符串长度 1≤n≤200 , 保证每组输入都至少含有一个数字。 输入一个字符串。 输出字符串中最长的数

    2024年02月08日
    浏览(55)
  • 代码随想录 Leetcode459. 重复的子字符串(KMP算法)

            此解法读者需要了解什么是KMP算法以及KMP算法中next数组的具体含义才能理解         因为在KMP算法的next数组中,next[index]表示 i ndex之前的最大长度的相同前缀后缀值 ,那么要判断整个字符串中是否由重复字串构成,只需要以下两个条件:         1.next[n - 1] !=

    2024年01月19日
    浏览(79)
  • C#,字符串匹配(模式搜索)KMP算法的源代码与数据可视化

      D.E.Knuth   J.H.Morris KMP 算法(Knuth-Morris-Pratt 算法)是其中一个著名的、传统的字符串匹配算法,效率比较高。 KMP算法由 D.E.Knuth , J.H.Morris 和 V.R.Pratt 在 Brute-Force 算法的基础上提出的模式匹配的改进算法。因此人们称它为“克努特—莫里斯—普拉特算法”,简称KMP算法。K

    2024年01月25日
    浏览(55)
  • Leecode找出字符串中第一个匹配项的下标 即实现strSTR()函数

    目录 简单介绍该函数的作用         在我们去用查找微信或者qq聊天记录的时候,我们总不能一句一句去找吧。我们需要用到的功能底层大概是此博客所讲的这个函数熬。 一.算法需要传入的参数和返回类型         需要传入的就是和所有的文本,返回的是当前

    2024年02月12日
    浏览(59)
  • Java实现两字符串相似度算法

    编辑距离:是衡量两个字符串之间差异的度量,它表示 将一个字符串转换为另一个字符串所需的最少编辑操作次数 (插入、删除、替换)。 计算方法可以有多种,其中一种 常见 的方法是 将编辑距离归一化为0到1之间的范围 (归一化编辑距离(Normalized Edit Distance)), 将编

    2024年02月05日
    浏览(74)
  • 使用Java实现高效的字符串匹配算法

    摘要:字符串匹配是计算机领域中的一个重要问题,有着广泛的应用场景。在本篇博客文章中,我们将介绍几种高效的字符串匹配算法,并给出使用Java语言实现的代码示例,希望能对读者理解和应用这些算法有所帮助。 一、KMP算法 KMP算法(Knuth-Morris-Pratt算法)是一种经典的

    2024年02月16日
    浏览(45)
  • KMP-重复子字符串

    Problem: 459. 重复的子字符串 给定一个字符串str1, 判断其是否由重复的子串构成。 例子1:输入 str1=‘ababab’ ;输出 true 例子2:输入 str1=‘ababac’ ;输出 false 重复子字符串组成的字符串,其肯定存在一个后缀和前缀是一样的,并且这个后缀其由后缀前面的字符子串组成。所以

    2024年01月25日
    浏览(73)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包