苦涩难懂kmp算法
文章只为记笔记,借鉴了其他博客的文章,勿怪。
1、漫画理解KMP算法::https://blog.csdn.net/qq_39213969/article/details/103472012
2、B站天勤视频:https://www.bilibili.com/video/BV17i4y1t76L?p=34
3、博客:https://blog.csdn.net/qq_37969433/article/details/82947411
暴力算法
int Index_BF ( char S [ ], char T [ ], int pos )
{
/* 若串 S 中从第pos(S 的下标0≤pos<StrLength(S))个字符
起存在和串 T 相同的子串,则称匹配成功,返回第一个
这样的子串在串 S 中的下标,否则返回 -1 */
int i = pos, j = 0;
while ( S[i+j] != '/0'&& T[j] != '/0')
if ( S[i+j] == T[j] )
j ++; // 继续比较后一字符
else
{
i ++; j = 0; // 重新开始新的一轮匹配
}
if ( T[j] == '/0')
return i; // 匹配成功 返回下标
else
return -1; // 串S中(第pos个字符起)不存在和串T相同的子串
} // Index_BF
kmp算法
typedef char String[MAXSIZE + 1];
void get_next(String T, int *next)//通过计算返回子串T的next数组
{
int i, j;
i = 1;
j = 0;
next[1] = 0;
while (i < T[0])//T[0]表示串的长度
{
if (j == 0 || T[i] == T[j])//T[i]表示后缀的单个字符,T[j]表示前缀的单个字符
{
++i;
++j;
next[i] = j;
}
else j = next[j];//若字符不相同,则j值回溯
}
}
int Index_KMP(String S, String T, int pos)//KMP算法
{
int i = pos;//i用于主串S中的当前位置下标,若pos不为1,则从pos位置开始匹配
int j = 1;//j用于子串T中当前位置下标值
int next[255];//定义一next数组
get_next(T, next);//对串T作分析,得到next数组
while (i < S[0] && j <= T[0])//若i小于S的长度并且j小于T的长度时,循环继续
{
if (j == 0 || S[i] == T[j])//两字母相等则继续,与朴素算法增加了j=0判断
{
++i;
++j;
}
else//指针后退重新开始匹配
j = next[j];//j退回合适的位置,i值不变
}
if (j > T[0])
return i - T[0];
else return 0;
}