Kmp算法

算法流程:

kmp_search(char[] text,char[] pattern)

构建前缀表

prefix[0]默认为0
i从1开始遍历pattern

pattern[i]==pattern[len]时,采用的策略
len++;//最长公共前缀+1
prefix[i]=len;//记录当前i位置的前缀
i++;//向后移动1位
pattern[i]!=pattern[len]时,采用的策略
如果前缀值>0 ,则向左下移动
    len=prefix[len-1];
&#x5982;&#x679C;&#x524D;&#x7F00;&#x503C;<=0,则记录前缀值,并右移 prefix[i]="len;//len&#x5176;&#x5B9E;&#x5C31;&#x662F;0" i++; < code></=0,则记录前缀值,并右移>

KMP搜索

看代码吧..

完整KMP

public class Kmp {
/*
 *@func &#x6784;&#x5EFA;&#x524D;&#x7F00;&#x8868;
 *@param pattern:&#x5339;&#x914D;&#x5B57;&#x7B26;&#x6570;&#x7EC4;,prefix&#xFF1A;&#x524D;&#x7F00;&#x8868;,n&#x5339;&#x914D;&#x5B57;&#x7B26;&#x6570;&#x636E;&#x7684;&#x957F;&#x5EA6;
 */
public static void prefix_table(char[] pattern,int[] prefix,int n){
    prefix[0] =0;//&#x524D;&#x7F00;&#x8868;&#x7B2C;&#x4E00;&#x4E2A;&#x521D;&#x59CB;&#x4E3A;0
    int len =0;//len&#x4E3A;&#x524D;&#x7F00;&#x503C;&#xFF0C;&#x4ECE;0&#x5F00;&#x59CB;
    int i =1;//&#x4ECE;&#x7B2C;&#x4E00;&#x4E2A;&#x5F00;&#x59CB;
    while(i<n){ if(pattern[i]="=pattern[len]){//&#x5F53;&#x524D;&#x5B57;&#x7B26;&#x4E0E;&#x524D;&#x7F00;&#x503C;&#x76F8;&#x540C;" len++; prefix[i]="len;" i++; }else{ 当前字符与前缀值相同不同 if(len>0)
                len=prefix[len-1];//&#x5DE6;&#x4E0B;&#x79FB;&#x52A8;&#xFF0C;&#x76F4;&#x5230;&#x524D;&#x7F00;&#x503C;&#x7B49;&#x4E8E;0
            else{
                prefix[i]=len;//&#x524D;&#x7F00;&#x503C;&#x4E3A;0,&#x8D4B;&#x503C;&#x7ED9;&#x5F53;&#x524D;i&#x7684;&#x524D;&#x7F00;&#x503C;
                i++;//i&#x53F3;&#x79FB;
            }
        }
    }
}
/*
 *@func &#x5B8C;&#x6210;&#x524D;&#x7F00;&#x8868;&#x7684;&#x6784;&#x5EFA;
 */
public static void move_table(int[] prefix){
    int len=prefix.length;
    for(int i=len-1;i>0;i--)
    {
        prefix[i]=prefix[i-1];
    }
    prefix[0]=-1;
}
public static void kmp_search(char[] text,char[] pattern){
    int n=text.length;//n =text&#x7684;&#x957F;&#x5EA6;
    int m=pattern.length;//m=pattern&#x7684;&#x957F;&#x5EA6;
    int i=0;//&#x904D;&#x5386;text
    int j=0;//&#x904D;&#x5386;pattern
    //&#x6784;&#x5EFA;&#x524D;&#x7F00;&#x8868;
    int [] prefix=new int[m];
    prefix_table(pattern,prefix,m);
    move_table(prefix);

    while(i<n){ 遍历text if(j="=m-1&&text[i]==pattern[j])//&#x5F53;&#x5339;&#x914D;&#x5230;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x5B57;&#x7B26;&#x65F6;" { system.out.println("found:"+(i-j)); j="prefix[j];//&#x7EE7;&#x7EED;&#x5411;&#x540E;&#x5339;&#x914D;" } if(text[i]="=" pattern[j]) 对比相同 i++; j++; }else 对比不相同 public static void main(string[] args) string text="ABABABCABAABABCABAA" ; pattern="ABABCABAA" kmp_search(text.tochararray(), pattern.tochararray()); < code></n){></n){>

参考文献:

https://www.bilibili.com/video/BV1Px411z7Yo/?spm_id_from=333.788.recommend_more_video.-1 —-KMP字符串匹配算法1
https://www.bilibili.com/video/BV1hW411a7ys/?spm_id_from=333.788.recommend_more_video.0 —-KMP字符串匹配算法2

Original: https://www.cnblogs.com/alexanders/p/16284318.html
Author: AlexanderOscar
Title: Kmp算法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/643196/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球