字符串匹配算法(KMP)
KMP算法的作用是在一个已知字符串中查找子串的位置,也叫做串的模式匹配。比如主串s=“university”,子串t=“sit”。现在我们要找到子串t 在主串s 中的位置。
列如:
在T字符串中找到P字符串。
首先得到P字符串的前缀表:
void prefix_table(char pattenrn[], int prefix[], int n)
{
prefix[0] = 0;
int len = 0;
int i = 1;
while (i < n)
{
if (pattenrn[i] == pattenrn[len])
{
len++;
prefix[i] = len;
i++;
}
else
{
if (len > 0)
len = prefix[len - 1];
else
{
prefix[i] = len;
i++;
}
}
}
}
void move_prefix_table(int prefix[], int n)
{
for (int i = n - 1; i > 0; i--)
{
prefix[i] = prefix[i - 1];
}
prefix[0] = -1;
}
字符串对其下标对其匹配。
当匹配失败时将当前位置移动前缀表对应的下标位置在进行匹配,
以此类推,直至匹配完成。
void kmp_search(char text[], char pattern[])
{
int n = strlen(pattern);
int tetxLen = strlen(text);
int * prefix = (int*)malloc(sizeof(int) * n);
prefix_table(pattern, prefix, n);
move_prefix_table(prefix, n);
int i = 0;
int j = 0;
while (i < tetxLen)
{
if (j == n - 1 && text[i] == pattern[j])
{
printf("Found pattern at %d\n", i - j);
j = prefix[j];
}
if (text[i] == pattern[j])
{
i++;
j++;
}
else
{
j = prefix[j];
if (j == -1)
{
i++;
j++;
}
}
}
}