首页 > 编程语言 >kmp算法

kmp算法

时间:2023-11-14 22:35:12浏览次数:39  
标签:charAt val int needle next 算法 kmp

2023-11-14

作用:从一个字符串中找到另一个字符串的位置

思路:

        暴力匹配-》主串的指针一直往前走,不后退-》匹配串的指针回退的位置变小-》根据前缀表

 

求前缀表(匹配串的所有前缀的最长公共前后缀长度表):

/求前缀表
        int[] next=new int[needle.length()];
        next[0]=0;
        int val=0;
        for(int i=1;i<needle.length();i++){
            while(val>0 && needle.charAt(i)!=needle.charAt(val)){
                val=next[val-1];
            }
            if(needle.charAt(i)==needle.charAt(val)){
                val++;
            }
            next[i]=val;
        }

 kmp算法:

//kmp           
        for(int i=0,j=0;i<haystack.length();i++){
 
            while(j>0 && haystack.charAt(i)!=needle.charAt(j)){//先j退,不相等继续退,可能会退到0
                j=next[j-1];  //最前面next[0]是0,不用特别注意
            }
 
            if(haystack.charAt(i)==needle.charAt(j)){
                //i++;           //i放在这,可能全部首字母都不匹配呢
                j++;
            }
 
           if(j==needle.length()){
                return i-j+1;
            }
 
 
        }
 
        return -1; 

全部代码:

  

class Solution {
    public int strStr(String haystack, String needle) {
        //暴力法
        //双指针
        //kmp算法
 
        //求前缀表
        int[] next=new int[needle.length()];
        next[0]=0;
        int val=0;
        for(int i=1;i<needle.length();i++){
            while(val>0 && needle.charAt(i)!=needle.charAt(val)){
                val=next[val-1];
            }
            if(needle.charAt(i)==needle.charAt(val)){
                val++;
            }
            next[i]=val;
        }
 
        //kmp           
        for(int i=0,j=0;i<haystack.length();i++){
 
            while(j>0 && haystack.charAt(i)!=needle.charAt(j)){//先j退,不相等继续退,可能会退到0
                j=next[j-1];  //最前面next[0]是0,不用特别注意
            }
 
            if(haystack.charAt(i)==needle.charAt(j)){
                //i++;           //i放在这,可能全部首字母都不匹配呢
                j++;
            }
 
           if(j==needle.length()){
                return i-j+1;
            }
 
 
        }
 
        return -1;
 
 
    }
}

  

 

标签:charAt,val,int,needle,next,算法,kmp
From: https://www.cnblogs.com/youye9527/p/17832759.html

相关文章

  • 树 算法题(一)
    1、计算二叉树中所有结点个数intCntNode(BiTreeT){intk=0;if(T){k++;k+=CntNode(T->lchild);k+=CntNode(T->rchild);}returnk;}2、计算二叉树中所有叶子节点的个数intLeafNode(BiTreeT){intk=0;if(T){......
  • 【算法基础】贪心算法 LeetCode 135. 分发糖果
    分发糖果题目介绍n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。你需要按照以下要求,给这些孩子分发糖果:每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。测试用......
  • 文心一言 VS 讯飞星火 VS chatgpt (135)-- 算法导论11.3 1题
    一、用go语言,假设我们希望查找一个长度为n的链表,其中每一个元素都包含一个关键字k并具有散列值h(k)。每一个关键字都是长字符串。那么在表中查找具有给定关键字的元素时,如何利用各元素的散列值呢?文心一言:在Go语言中,你可以通过使用一个哈希表来存储关键字的散列值,并在查找具有给......
  • 不平衡数据集神经网络回归SMOTE、SMOGN算法:R语言代码
      本文介绍基于R语言中的UBL包,读取.csv格式的Excel表格文件,实现SMOTE算法与SMOGN算法,对机器学习、深度学习回归中,训练数据集不平衡的情况加以解决的具体方法。  在之前的文章SMOGN算法的Python实现:不平衡数据的深度学习回归中,我们介绍了基于Python语言中的smogn包,实现SMOGN算......
  • 文心一言 VS 讯飞星火 VS chatgpt (135)-- 算法导论11.3 1题
    一、用go语言,假设我们希望查找一个长度为n的链表,其中每一个元素都包含一个关键字k并具有散列值h(k)。每一个关键字都是长字符串。那么在表中查找具有给定关键字的元素时,如何利用各元素的散列值呢?文心一言:在Go语言中,你可以通过使用一个哈希表来存储关键字的散列值,并在查找具有......
  • 平方根倒数快速算法
    平方根是什么?给定一个x,我想算x^(1/2),就是在算平方根在计算机里最常见的算法是牛顿迭代法牛顿迭代法平方根倒数是什么?给定一个x,我想算x^-(1/2),就是在算平方根的倒数平时我们是如何计算的?如果在纸上写,就是一步一步的算,先算平方根(一般就是查表法),再求倒数;但是大部分的数是无......
  • TSINGSEE视频汇聚管理与AI算法视频质量检测方案
    一、建设背景随着互联网视频技术的发展,视频监管在辅助安全生产、管理等方面发挥了不可替代的作用。但是,在监管场景中,仍然存在视频掉线、视频人为遮挡、视频录像存储时长不足等问题,对企业的日常管理和运转存在较大的安全隐患。企业原有视频运维系统存在检测准确率低、告警提醒滞后......
  • Java非对称加密RSA算法
    简介:公开密钥密码学(英语:Public-keycryptography)也称非对称式密码学(英语:Asymmetriccryptography)是密码学的一种算法。加密与解密使用不同的密钥,其中一个称之为公钥,对外公开,通常用于数据加密。另一个称之为私钥,是不能对外公布的,通常用于数据解密,这样使用公钥加密的数据即使被......
  • 视频质量AI检测算法与LiteCVR视频质量诊断方案介绍
    LiteCVR视频质量诊断方案可以实现对监控设备常见的异常抖动、画面条纹、画面模糊、偏色、亮度异常、对比度异常、冻结、丢失、噪声等机器故障及恶意遮挡、恶意变化监控场景的行为做出准确判断,还可以对监控设备因为网络异常等原因导致的设备断线、取流异常、码率是否达标等问题进行......
  • JVM之垃圾回收算法
    1.概述在JVM中,最大的亮点就是自动垃圾回收机制,那它是根据什么依据来判断是垃圾的呢,又是根据什么算法来回收垃圾的呢?不同的垃圾回收算法有不同的特点和应用场景,本文整理了JVM常见的几种垃圾回收算法,以及其优缺点和适用场景供读者参考。不熟悉JVM内存模型的可先参考如下这篇文章(......