码迷,mamicode.com
首页 > 编程语言 > 详细

KMP算法

时间:2020-09-11 14:12:53      阅读:42      评论:0      收藏:0      [点我收藏+]

标签:isp   width   ++   位置   pre   字符   idt   最长前缀   closed   

KMP:一种模式匹配算法

重点:next数组:长度就是模式子串的长度

   next[i]的值是若第i个位置不匹配则下一个要进行匹配的首地址

重点理解前缀后缀:例如:abcabc的最长前缀abc,后缀abc,

            aaaa的前缀是aaa(aaaa就没有意义了)后缀是aaa.

 

技术图片

 

技术图片

 

技术图片

 

 技术图片

 

 分析:j值回溯:j返回到前一个失配的适配值

代码记住就好,感觉就是恰好就是这样,理解起来好难!!

技术图片
 1 #include <stdio.h>
 2 typedef char *String;
 3 void get_next(String T,int *next)
 4 {
 5     int i = 1;
 6     int j = 0;
 7     next[1] = 0;
 8     while(i<T[0])
 9     {
10         if(j==0 || T[i]==T[j])
11         {
12             i++;
13             j++;
14             //next[i] = j;
15             //改进的KMP的next数组
16             if(T[i]!=T[j])       //若当前字符与前缀字符不同
17                 next[i] = j;        
18             else
19                 next[i] = next[j];
20         }
21         else
22         {
23             j = next[j];
24         }
25     }
26 }
27 
28 //返回子串T在主串S的第pos个字符之后的位置
29 //若不存在,则返回0
30 int index_KMP(String S,String T,int pos)
31 {
32     int i = pos;
33     int j = 1;
34     int next[255];
35 
36     get_next(S, next);
37     while(i<=S[0] && j<=T[0])
38     {
39         //容易丢掉j==0,因为后面next[j]可能=0
40         if(j==0 || S[i]==T[j])
41         {
42             i++;
43             j++;
44         }
45         else
46         {
47             j = next[j];
48         }
49     }
50     if(j>T[0])
51     {
52         return i - T[0];
53     }
54     else
55         return 0;
56 }
57 
58 int main()
59 {
60     char str[255] = " ababab";
61     int next[255];
62 
63     str[0] = 6;
64     get_next(str, next);
65 
66     for (int i = 1; i < 7;i++)
67         printf("%d ", next[i]);
68 }
View Code

 

KMP算法

标签:isp   width   ++   位置   pre   字符   idt   最长前缀   closed   

原文地址:https://www.cnblogs.com/wuweixiong/p/13586031.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!