字符串匹配模式

1.BF(Brute Force)算法,即蛮力算法

【算法思想】:

第(1)步;从主串S的第pos个字符和模式的第一个字符进行比较之,若相等,则继续逐个比较后续字符;否则从主串的下一个字符起再重新和模式串的字符比较之。

第(2)步骤;依次类推,直至模式T中的每一个字符依次和主串S中的一个连续的字符序列相等,则称匹配成功;函数值为和模式T中第一个字符相等的字符在主串S中的序号,否则称为匹配不成功,函数值为0。

比如对于主串S=”abacababc”; 模式串T=”abab”; 匹配成功,返回4。

对于主串S=”abcabcabaac”; 模式串T=”abab”; 匹配不成功,返回0。

代码示例:

int BruteForce(const char* strS, const char* strT, const int nPos)
{
	int iT(0),iS(0),iPos(nPos);

	int nLenT = strlen(strT);
	int nLenS = strlen(strS);
	
	while(iT < nLenT && iS < nLenS)
	{
		if (strS[iPos + iS] == strT[iT])
		{
			iS++;
			iT++;
		}
		else
		{
			iT = 0;
			iS = 0;
			iPos++;
		}
	}

	if (iT >= nLenT)
		return iPos; //返回第一次匹配的第一个字符位置
	return -1;
}

[算法时间复杂度]:设主串长度为m,模式串的长度为n。一般情况下n<m。

最好时间复杂度:O(n)如:主串S="12344556" ,模式串T="123"。

最坏时间复杂度:O( (m - n + 1) * n) 如,主串S=”1111111111110, 模式串T=”1110”。

平均时间复杂度:O(m*n)。


2.KMP算法

KMP算法是在BF算法上的改进,在匹配时不再像BF那样每次从模式串的第一个字符开始比较,KMP则优化了这个过程。


int kmp(const char* strT, const char* strP)
{
	int next[MAX_STRING_LEN];
	//先求模式串数组
	next[0] = -1;  
	int i(0),j(-1);  
	int lenP = strlen(strP);
	while(i < lenP)  
	{  
		if(j == -1 || strP[i] == strP[j])  
		{  
			++i;  
			++j;  
			next[i] = j;  
		}  
		else  
		{  
			j = next[j];  
		}  
	}

	//进行匹配
	int iPos(0),jPos(0);  
	int lenT = strlen(strT);
	while(iPos < lenT && j < lenT)  
	{  
		if(j == -1 || strT[iPos] == strP[jPos])  
		{  
			iPos++;  
			jPos++;  
		}  
		else  
		{  
			jPos = next[jPos];  
		}  
	}  
	if(jPos == lenP)  
	{  
		return( iPos - lenP);  
	}  
	
	return -1;
}

[算法时间复杂度]:O( m + n )。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值