字符串匹配問題的解決方法

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;
}

發佈了35 篇原創文章 · 獲贊 13 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章