C++实现 字符串的匹配(详细)

51 篇文章 13 订阅
47 篇文章 2 订阅

问题引入

        利用模式匹配算法,对采用定长顺序存储结构的字符主串,从它的第pos个字符起和模式的字符比较,若相等,则继续逐个比较后续字符,直到模式串中的每个字符都和主串中的字符序列匹配成功,返回主串的pos。

        例如:

        模式串是”0000 1”,主串是”0000 0000 0000 0000 0000 1”。

代码实现

#include<iostream>
#include<stdio.h>
using namespace std;
#define Volume 100 //定义串初始容量为100 


//定义串结构
typedef struct{
	char ch[Volume]; //串的容量 
	int length; //串长 
}HString;
 
//存入串值 
void createHString(HString &S,int n){
	S.length=n; //存储串长 
	for(int i=0;i<n;i++){ //输入串值 
		cin>>S.ch[i]; 
	}
} 

//输出串值 
void printHString(HString S){
	int i;
	for(i=0;i<S.length;i++){ //输出串值 
		cout<<S.ch[i]<<' ';
	}
	cout<<endl; //换行 
}

//定位模式串匹配成功时在主串中的位置 
int IndexHString(HString S,HString T,int pos){
	int i=pos; //主串S中当前比较的字符位置
	int j=1; //模式串T中当前比较的字符位置 
	while(i<=S.length && j<=T.length){  
		if(S.ch[i]==T.ch[j]){   //比较下一字符 
			++i;
			++j;
		}else{  //后退重新进行匹配 
			i=i-j+2;
			j=1;
		}
	}
	if(j>T.length){ //或取模式串在主串中的位置并返回值 
		return i-T.length;
	}else{
		return -1; //模式串未匹配成功,返回-1 
	}
	cout<<endl; //换行 
} 

int main(){
	HString S,T;
	int m,n,pos;
	cout<<"定义主串长度为:";
	cin>>m;
	cout<<"请输入主串串值:";
	createHString(S,m);
	cout<<"输出串值验证:"<<endl;
	printHString(S);
	cout<<endl;
	
	cout<<"定义模式串长度为:";

	cin>>n;
	cout<<"请输入模式串串值:";
	createHString(T,n);
	cout<<"输出串值验证:"<<endl;
	printHString(T);
	cout<<endl;
	
	cout<<"输入从主串哪个字符位置开始匹配:";
	cin>>pos;
	cout<<"模式串中字符与主串中字符相同时,在主串的pos为:"<<IndexHString(S,T,pos);
}




运行结果

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等日出看彩虹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值