数据结构-字符串

字符串-模式匹配
给定主串S="s1s2…sn"和模式T=“t1t2…tm”,在S中寻找T 的过程称为模式匹配。
BF算法
给定主串S="s1s2…sn"和模式T=“t1t2…tm”,
在S中寻找T 的过程称为模式匹配。
如果匹配成功,返回T 在S中的位置,如果匹配失败,返回-1。
BF算法

  1. 在串 S 和串 T 中设比较的起始下标 i 和 j;

  2. 循环直到 S 或 T 的所有字符均比较完

     2.1 如果S[i] 等于T[j],继续比较 S 和 T 的下一个字符;
     2.2 否则,将 i 和 j 回溯,准备下一趟比较;
    
  3. 如果T中所有字符均比较完,则返回匹配的起始比较下标;否则如果匹配不成功,则返回 -1;

//模式匹配BF算法 
#include <iostream>
using namespace std;

int BF(char S[ ], char T[ ]);

int main( )
{
	char s1[100], s2[10];
	int index = 0;
	cout << "请输入主串:";
	cin >> s1;
	cout << "请输入模式串:";
	cin >> s2;
	index = BF(s1, s2);
	if (index == -1)
		cout << s2 << "不是" << s1 << "的子串" << endl;
	else
		cout << s2 << "在" << s1 << "的位置是: " << index << endl;
	return 0;
}
int BF(char S[ ], char T[ ])
{
  	int start = 0;                         /*主串从下标0开始第一趟匹配*/
  	int i = 0, j = 0;                       /*设置比较的起始下标*/
	while ((S[i] != '\0') && (T[j] != '\0'))
	{
  		if (S[i] == T[j]) 
  		{
  			i++;
  			j++;
  		}  
  		else 
  		{ 
  			start++; 
  			i = start; 
  			j = 0; 
  		}        /*i和j分别回溯*/
  	}
  	if (T[j] == '\0') 
  		return start + 1;          /*返回本趟匹配的起始位置*/
  	else 
  		return -1;
}

KMP算法
1.在串S和串T中分别设比较的起始下标i和j;
2. 循环直到S中所剩字符长度小于T的长度或T中所有字符均比较完毕

	2.1 如果S[i]==T[j],继续比较S和T的下一个字符;否则
	2.2 将j向右滑动到next[j]位置,即j=next[j];
	2.3 如果j=-1,则将i和j分别加1,准备下一趟比较;
  1. 如果T中所有字符均比较完毕,则返回匹配的起始下标;否则返回-1;
//next数组生成
void Compute_Next(char t[], int next[])
{
	int j,k;
     next[0]=-1;
     j=1;
	while(t[j]!='\0')
	{
		k=next[j-1];
		while((k!=-1)&&(t[k]!=t[j-1]))
			k=next[k];
		next[j]=++k;
		j++;
	}
}

//KMP算法
int KMP_FindPat(char *s, char *t,int *next){
	int i=0,j=0,k;
	while(s[i]!='\0' && t[j]!='\0')	{
		if(j==-1 || s[i]==t[j])	{
                 i++;
                 j++;
           }
		else
		      j=next[j];
	}
	if(t[j]=='\0')
		return i-j;
	else
		return -1;
}

通过t的next数组,来确定t相对于s的后移位数来减少比对次数。
next数组定义如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值