代码改变世界

数据结构实验四 串基本操作的实现

2019-10-10 11:21  木木王韦  阅读(518)  评论(0)    收藏  举报

实验目的:

1.掌握串的模式匹配操作。

实验要求:

1.分别使用BF和KMP算法完成串的模式匹配。

实验过程:

1.设计完成next值的计算函数;

2.设计完成修正next值的函数;

3.KMP算法代码;

4.输入子串(abbc)和主串(abbabbcad)

5.输出子串在主串中开始的位置。

实验结果:

输入:子串:abbc  主串:abbabbcad

输出:4

实验分析:

1.普通next和修正next的区别;

2.列举调试运行过程中出现的错误并分析原因。

 

 

BF+KMP算法代码:

#include<iostream> 
using namespace std; 
long long sum1=0,sum2=0;
int l1,l2;
void  BF(string s1,string s2,long long sum1)
{
	int l1=s1.size(),l2=s2.size();
	int pos=-1;
	
	for(int i=0;i<l2;i++){
		for(int j=0;j<l1;j++){
		sum1++;
			if(s2[i+j]==s1[j]){
				
				if(j==l1-1){
					pos=i+1;
					cout<<"该主串中含有该子串,并且在主串中出现该子串的第一个位置在"<<pos<<"处。"<<endl;
				}
			}
			else break;
		}
	}
 	
	if(pos==-1) cout<<"该主串中不含有子串。"<<endl;
	cout<<"BF算法对于该数据运行的次数为:"<<sum1<<endl;
	}  
int GetNext(string P, int next[],long long sum2){
	sum2=0;
    int L=P.size();
    int i=0;   // P 的下标
    int j=-1;
      next[0]=-1;
    while(i<L-1)
    {
		
        if(j==-1||P[i]==P[j])
        {
        	sum2++;
            i++;
            j++;
            next[i]=j;
        }
        else{
        	
        	 j=next[j];
		}
               }
               int flag=0;
	for(int i=l1+1;i<L;i++){
		if(next[i]==l1){
			flag=1;
			cout<<"该主串中含有该子串,出现子串的第一个位置在:"<<i-2*l1<<endl;
 		}
	}
	if(!flag)
 		cout<<"该主串中没有出现该子串!"<<endl;
 	cout<<"KMP算法对于该数据运行的次数为:"<<sum2<<endl; 
}
int main(){
	string s1,s2;
	
	int next[10010];
	cout<<"请输入子串:";
	cin>>s1;
	cout<<"请输入主串:";
	cin>>s2;
	cout<<"BF算法的结果是:"<<endl;
	BF(s1,s2,sum1);
	
 	l1=s1.size(),l2=s2.size();
	s1+='#';
	s1+=s2;
	int L=s1.size();
	cout<<"KMP的算法结果为:"<<endl;
		GetNext(s1,next,sum2);
	
return 0;
}