1.串的定义:
朴素模式匹配:
#include<iostream>
#include<stdio.h>
using namespace std;
#define MAXSTRLEN 50
typedef unsigned char SString[MAXSTRLEN + 1];//0号单元存放串的长度
//返回子串T在主串S中第pos个字符之后的位置。若不存在返回0
int indexBF(SString S, SString T, int pos)
{
int i = pos, j = 1; /*i 用于主串S 中当前位置下标.若PQS 不为1 */
/*1从pos 位置开始匹配*/
while (i <= S[0] && j <= T[0])
{
if (S[i] == T[j])
{
i++;
j++;
}
else
{
i = i - j + 2;//i-j+1退到原位置,所以+1在后退一位
j = 1;
}
}
if (j > T[0])//完全匹配
{
return i - T[0];
}
else
return 0;
}
void initStr(SString &S, char str[])
{
int i = 0;
while (str[i] != '\0')
{
S[i + 1] = str[i];
i++;
}
S[i + 1] = '\0';
S[0] = i;
}
void printStr(SString str)
{
for (int i = 1; i <= str[0]; i++)
{
printf("%c", str[i]);
}
printf("\n");
}
void main()
{
SString S;
initStr(S, "ababcabcacbab");
printStr(S);
SString T;
initStr(T, "abcac");
printStr(T);
int index = indexBF(S, T, 1);
printf("index is %d\n", index);
system("pause");
}
KMP模式匹配:
//获得next数组
void get_next(SString T, int next[])
{
int i, j;
i = 1; j = 0;
next[1] = 0;
while (i < T[0])//T0串的长度
{
if (j == 0 || T[i] == T[j]) /* T[i ) 表示后级的单个字符. */
/* T[j] 农示前级的单个字符*/
{
++i;
++j;
next[i] = j;
}
else
{
j = next[j];
}
}
}
//匹配
int Index_KMP(SString S, SString T, int pos, int next[])
{
int i = pos;
int j = 1;
//int next[255];
get_next(T, next);
while (i <= S[0] && j <= T[0])
{
if (j == 0 || S[i] == T[j])
{
++i; ++j;
}
else
{
j = next[j]; //减少了i的回溯
}
}
if (j > T[0])
{
return i - T[0];
}
else
return 0;
}
改进KMP模式匹配:
//=======改进获得next数组
void get_next2(SString T, int nextval[])
{
int i, j;
i = 1; j = 0;
nextval[1] = 0;
while (i < T[0])//T0串的长度
{
if (j == 0 || T[i] == T[j]) /* T[i ) 表示后级的单个字符. */
/* T[j] 农示前级的单个字符*/
{
++i;
++j;
if (T[i] != T[j]) /*当前字符与前缀字符不同*/
/* 当前的j为nextval在i位置的值*/
nextval[i] = j;
else
nextval[i] = nextval[j];
}
else
j = nextval[j];
}
}
//匹配gaiing
int Index_KMP2(SString S, SString T, int pos,int next[])
{
int i = pos;
int j = 1;
//int next[255];
get_next2(T, next);
while (i <= S[0] && j <= T[0])
{
if (j == 0 || S[i] == T[j])
{
++i; ++j;
}
else
{
j = next[j]; //减少了i的回溯
}
}
if (j > T[0])
{
return i - T[0];
}
else
return 0;
}
参考资料:
- 《大话数据结构》