字符串匹配的算法(暴力算法和KMP算法)

学习字符串匹配算法有一段时间了,不过还是有点迷糊,虽然了解算法过程,但是在编码的时候还是会有些迷糊。

先把写的程序放在这里,以后有时间再来翻着看看吧!

#include<iostream>
#include<string>
using namespace std;
int KMPfind(char* s, char* p);
void GetNext(char* p, int next[]);
int ViolentMatch(char* s, char* p);
int main()
{
	char s1[] = "abcaabbaacaadaabbaa";
	char s2[] = "aadaab";
	cout << "In the string " << s1 << ", the string " << s2 << " is started at the "
		<< ViolentMatch(s1, s2);
	cout << endl<<KMPfind(s1, s2)<<endl;
	return 0;
}
void GetNext(char* p, int next[])
{
	int pLen = strlen(p);
	int i = -1; int j = 0;//i从-1开始,让不匹配的回溯到开始位置进行匹配
	next[0] = -1;//
	for (; j < pLen-1;)
	{
		if (i==-1||p[i] == p[j])
		{
			++i; ++j; next[j] = i;
		}
		else
			i = next[i];//i回溯到next[i]的位置
	}

}
int KMPfind(char* s, char* p)
{
	int i = 0;
	int j = 0;
	int sLen = strlen(s);
	int pLen = strlen(p);
	int * next = new int[strlen(p)];
	GetNext( p,  next);
	while (i < sLen && j < pLen)
	{
		//①如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++
		if (j == -1 || s[i] == p[j])
		{
			i++;
			j++;
		}
		else
		{
			//②如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j]
			//即通过next数组得到下次比较的位置
			j = next[j];
		}
	}
	delete []next;
	if (j == pLen)//比较完毕而且比较了模式字符串的长度表示找到匹配字符串
		return i - j;
	else
		return -1;
}
int ViolentMatch(char* s, char* p)
{
	int sLen = strlen(s);
	int pLen = strlen(p);

	int i = 0;
	int j = 0;
	while (i < sLen && j < pLen)
	{
		if (s[i] == p[j])
		{
			//①如果当前字符匹配成功(即S[i] == P[j]),则i++,j++
			i++;
			j++;
		}
		else
		{
			//②如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0
			i = i - j + 1;
			j = 0;
		}
	}
	//匹配成功,返回模式串p在文本串s中的位置,否则返回-1
	if (j == pLen)
		return i - j;
	else
		return -1;
}

时间: 2024-10-08 22:37:52

字符串匹配的算法(暴力算法和KMP算法)的相关文章

BF算法和KMP算法

串的模式匹配算法即确定主串中所含子串第一次出现的位置.BF算法是古典的,采用穷举的思想,而KMP算法是模式匹配算法的改进算法. 1.BF算法设计思想:将主串的第pos个字符和模式的第1个字符比较, 若相等,继续逐个比较后续字符: 若不等,从主串的下一字符(pos+1)起, 重新与第一个 字符比较.直到主串的一个连续子串字符序列与模式相等 .返回值为S中与T匹配的子序列第一个字符的序号,即匹配成功. 否则,匹配失 败. 例子:主串s="ababcabcacbab",模式t="abcac" BF算法

字符串匹配的BF算法和KMP算法学习

引言:关于字符串 字符串(string):是由0或多个字符组成的有限序列.一般写作`s = "123456..."`.s这里是主串,其中的一部分就是子串. 其实,对于字符串大小关系不如是否相同重要.包括密码验证.hash列等. 而字符串的存储结构有两种:顺序存储结构和链式存储结构.由于不同的字符是连在一起的,所以一般是开足够大的空间进行顺序存储,这样更符合字符串的意义. 一.BF算法实现 一种暴力的.朴素的模式匹配算法,是的,时间复杂度为O(M*N).而下面的KMP算法则是O(M+N)

串匹配模式中的BF算法和KMP算法

考研的专业课以及找工作的笔试题,对于串匹配模式都会有一定的考察,写这篇博客的目的在于进行知识的回顾与复习,方便遇见类似的题目不会纠结太多. 传统的BF算法 传统算法讲的是串与串依次一对一的比较,举例设目标串S="ababcabcacb",模式串T="abcac",利用BF算法这个过程就会表示为: 将S串理解为数组,底标从0开始,即从a开始,第一次匹配过程如下: ok,当发现T串尚未匹配结束,就开始出现了错误,S串坐标右移+1,开始从b匹配,过程如下: 出现不同,继续

字符串的模式匹配——Brute-Force算法和KMP算法

子串的定位操作是要在主串S中找出一个与子串T相同的子串,通常把主串S称为目标,把子串T称为模式把从目标S中查找模式为T的子串的过程称为“模式匹配”. 1.Brute-Force算法的设计思想 Brute-Force是普通的模式匹配算法.将主串S的第1个字符和模式T的第1个字符比较,若相等,继续逐个比较后续字符:若不等,从主串的下一字符起,重新与模式的第一个字符比较,直到主串的一个连续子串字符序列与模式相等 ,返回值为S中与T匹配的子序列第一个字符的序号,即匹配成功:否则,匹配失败,返回值 0.

串的模式匹配算法(BF算法和KMP算法)

串的模式匹配算法 子串的定位操作通常称为串的 模式匹配,其中T称为 模式串. 一般的求子串位置的定位函数(Brute Force) 我写java的代码是这样的 int index(String S,String T,int pos){ char[] s_arr = S.toCharArray(); char[] t_arr = T.toCharArray(); int i,j,k;//i是主串S的指针,j是模式串的指针 if(pos < 0 || pos>S.length() || S.len

BF算法和KMP算法(javascript版本)

var str="abcbababcbababcbababcabcbaba";//主串 var ts="bcabcbaba";//子串 function BF(s,t){//BF算法 var i=0,j=0,v=-1; while(i<s.length&&j<t.length){ if(s[i]==t[j]){//相等就移动指针 i++; j++; } else{//指针归零 i=i-j+1; j=0; } } if(j==t.lengt

单源最短路径算法——Bellman-ford算法和Dijkstra算法

 BellMan-ford算法描述 1.初始化:将除源点外的所有顶点的最短距离估计值 dist[v] ← +∞, dist[s] ←0; 2.迭代求解:反复对边集E中的每条边进行松弛操作,使得顶点集V中的每个顶点v的最短距离估计值逐步逼近其最短距离:(运行|v|-1次) 3.检验负权回路:判断边集E中的每一条边的两个端点是否收敛.如果存在未收敛的顶点,则算法返回false,表明问题无解:否则算法返回true,并且从源点可达的顶点v的最短距离保存在 dist[v]中. 1 BELLMAN-FORD

TCP_NODELAY和TCP_CORK nagle算法和cork算法

TCP_NODELAY 默认情况下,发送数据采用Nagle 算法.这样虽然提高了网络吞吐量,但是实时性却降低了,在一些交互性很强的应用程序来说是不允许的,使用TCP_NODELAY选项可以禁止Nagle 算法. 此时,应用程序向内核递交的每个数据包都会立即发送出去.需要注意的是,虽然禁止了Nagle 算法,但网络的传输仍然受到TCP确认延迟机制的影响. TCP_CORK 所谓的CORK就是塞子的意思,形象地理解就是用CORK将连接塞住,使得数据先不发出去,等到拔去塞子后再发出去.设置该选项后,内

时空权衡之输入增强 ----字符串匹配算法Horspool算法和Boyer-Moore算法

在算法设计的时空权衡设计技术中,对问题的部分或者全部输入做预处理,对获得的额外信息进行存储,以加速后面问题的求解的思想,我们称作输入增强. 其中字符串匹配算法Horspool算法和Boyer-Moore算法就是输入增强的例子. 首先了解一下字符串匹配的概念.我们把在一个较长的n个字符的串中,寻找一个给定的m个字符的串的问题,称为字符串匹配问题.较长的串称为text,而需要寻找的串称为pattern. 字符串匹配问题的蛮力算法很好理解:我们把pattern与text第一个字符对齐,从左往右比较pa