// KMPTest.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
using namespace std;
void KMP(char *primary, char *pattern,int n1,int n2, int *position);
void BuildNext(char *pattern, int length, int *next);
int main()
{
int * position = new int[40];//用于存放从peimary字符串中寻找出的 pattern 字符串的所在位置的下标 从1开始 position[0]中存放找到的所有位置的下标
char pattern[100] = " abcabc";//匹配字符串
char primary[100] = " abcabcabcabcdhfjdsk"; //主串
/*
cout << "please input the primary string !" << endl;
cin >> primary;
cout << "please input the patttern string !" << endl;
cin >> pattern;
*/
KMP(primary, pattern,19,6, position);
for (int i = 1; i <= position[0]; i++)
{
cout << position[i] << endl;
}
system("pause");
return 0;
}
void KMP(char *primary, char *pattern,int n1,int n2, int *position)
{
int next[50];
BuildNext(pattern,n2, next);//构造匹配字符串的next数组
position[0] = 0;//清0 记录找到的子串的个数
int i = 1;
int j = 1;
while (n1 - i >= n2 - j &&i<=n1)
{
if (primary[i] == pattern[j])
{
i++;
j++;
if (j == n2+1)
{
position[0]++;
position[position[0]] = i - n2;
j = 1;
}
}
else//当primary[i]!=pattern[j]时 移动parrern j的下标
{
j = next[j];
if (j == 0)
{
i++;
j++;
}
}
}
}
void BuildNext(char *pattern,int length, int *next)//构造pattern字符串的next数组
{
int i, j;//i为next数组的下标 j为可能的next数组的值
i = 1;//next数组下标从1到 length next[i]=j 的意思是当第i个字符匹配不成功时 应该和第j个字符匹配
j = 0;
next[1] = 0;
while (i <= length)
{
if (j == 0 || pattern[i ] == pattern[j ])//如果第i个和第j个元素相等 在比较i+1元素失败时可以比较 j+1元素 在j=0时即前面和后面没有一个元素匹配成功 则在比较i++元素失败时 则需和pattern中的第一个元素进行比较
{
j++;
i++;
next[i] = j;
}
else
{
j = next[j];
}
}
}
字符匹配 kmp算法
最新推荐文章于 2023-02-05 19:04:47 发布