字符串匹配问题的解决方法

BF算法

代码实现:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int BF(const char* s,char* sub,int pos)
{
	int i = pos;//源字符串匹配的初始位置
	int j = 0;//目标字符串初始位置
	int slen = strlen(s);
	int sublen = strlen(sub);
	while(i < slen && j < sublen)
	{
		if(s[i] == sub[j])
		{
			i++;
			j++;
		}
		else
		{
			i = i-j+1;//源字符串初始位置向前走一步
			j = 0;//目标字符串回到首位置
		}
	}
	if(j >= sublen)
	{
		return i-j;//匹配成功,返回源字符串刚开始比较位置
	}
	else
	{
		return -1;//匹配失败,返回-1
	}	
}
int main()
{
	char* s = "ababcabc";
	char* sub = "abca";
	printf("%d\n",BF(s,sub,0));
	printf("%d\n",BF(s,sub,3));
	return 0;
}

KMP算法

代码实现:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
void GetNext(int* next,const char* sub)//获取next数组
{
	int sublen = strlen(sub);
	next[0] = -1;
	next[1] = 0;
	int i = 2;
	int k = 0;
	while(i < sublen)
	{
		if((k == -1) || (sub[k] == sub[i-1]))
		{
			next[i++] = ++k;
		}
		else
		{
			k = next[k];
		}
	}
}
int KMP(const char* s,char* sub,int pos)
{
	int i = pos;//源字符串匹配的初始位置
	int j = 0;//目标字符串初始位置
	int slen = strlen(s);
	int sublen = strlen(sub);
	int* next = (int*)malloc(sublen * sizeof(int));
	assert(next != NULL);
	GetNext(next,sub);
	while(i < slen && j < sublen)
	{
		if(s[i] == sub[j])
		{
			i++;
			j++;
		}
		else
		{
			j = next[j];//i不变,j回退
		}
	}
	free(next);
	if(j >= sublen)
	{
		return i-j;//匹配成功,返回源字符串刚开始比较位置
	}
	else
	{
		return -1;//匹配失败,返回-1
	}
}
int main()
{
	char* s = "ababcabc";
	char* sub = "abca";
	printf("%d\n",KMP(s,sub,0));
	return 0;
}

猜你喜欢

转载自blog.csdn.net/century_sunshine/article/details/80063639
今日推荐