数据结构(C&C++)
串
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 25
typedef struct {
char ch[MaxSize];
int length;
}SString;
typedef struct {
char* ch;
int length;
}HString;
int Index(SString S, SString T) { //普通匹配算法,时间复杂度O(mn)
int i = 1, j = 1;
while (i <= S.length && j <= T.length) {
if (S.ch[i] == T.ch[j]) {
i++;
j++;
}
else
{
i = i - j + 2; //主串指针回退 i-(j-1)+1
j = 1; //模式串指针回退
}
}
if (j > T.length)
return i - T.length;
else
{
return 0;
}
}
void get_next(SString T, int next[]) {
int i=1, j = 0;
next[1] = 0;
while (i < T.length) {
if (j == 0 || T.ch[i] == T.ch[j]) {
++i; ++j;
next[i] = j;
}
else
j = next[j];
}
}
int Index_KMP(SString S, SString T, int next[]) { //时间复杂度O(m+n)
int i = 1, j = 1;
while (i <= S.length && j <= T.length) {
if (j == 0 || S.ch[i] == T.ch[j]) {
++i;
++j;
}
else
{
j = next[j];
}
}
if (j > T.length)
return i - T.length;
else
{
return 0;
}
}
void get_nextval(SString T, int nextval[]) {
int i = 1, j = 0;
nextval[1] = 0;
while (i<T.length)
{
if (j == 0 || T.ch[i] == T.ch[j]) {
++i;
++j;
if (T.ch[i] != T.ch[j])
nextval[i] = j;
else
nextval[i] = nextval[j];
}
else
j = nextval[j];
}
}
串的模式匹配与普通匹配算法的区别:主串指针是否回溯