字符串匹配BF算法和KMP算法

16学年—17学年第 1学期 数据结构 实验任务书

专业名称:              实验学时:    2    

课程名称:数据结构      任课教师:  翟海霞     

实验题目: 串的模式匹配算法实现                  

实验环境:    Visual C++ 6.0                   

实验目的

理解串的特点和几种不同的存储结构,掌握基本的运算(赋值、比较、连接,模式匹配……等),比较模式匹配BF算法和KMP算法;  

 

实验内容:

1.实现串的赋值及模式匹配算法。

2.设任意n个整数存放于数组A(1:n)中,试编写算法,将所有正数排在所有负数前面(要求算法复杂性为0(n))。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>   
#define MaxSize 100 //串的最大长度   
//串的定长顺序储存结构   
typedef struct//  
{    
    char ch[MaxSize];//储存串的一维数组  
}sstring;

int  Index_BF(sstring S,sstring T,int pos)
{
	int i=pos,j=0;
	while(i<strlen(S.ch)&&j<strlen(T.ch))//两个串均未到串尾 
	{
		if(S.ch[i-1]==T.ch[j])
		i++,++j;//继续比较后续字符 
		else
		i=i-j+1,j=0;
	}
	if(j==strlen(T.ch)) return i-strlen(T.ch);//匹配成功 
	else return 0;//匹配失败 
}
int main()
{
sstring S,T;
int pos,ans;
printf("输入主串S:\n");
scanf("%s",S.ch);
printf("输入字串T:\n");	
scanf("%s",T.ch);
printf("请输入pos的值:");    
scanf("%d",&pos);        
ans=Index_BF(S,T,pos); 
printf("子串T在主串S中第pos个字符之后的位置为:");   
printf("%d\n",ans);      
system("pause");    
  return 0;  

}

KMP算法

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct
{
	char ch[MAXSIZE+1];
}sstring;
void get_next(sstring T,int next[])
{
	//求模式串T的next函数值并存入数组
	int i=1,j=0; 
	next[1]=0;
	while(i<strlen(T.ch))
	{
		if(j==0||T.ch[i]==T.ch[j]){
			++i;++j;
			next[i]=j;
		}
		else j=next[j];
	}
 } 
int Index_KMP(sstring S,sstring T,int pos,int next[])
{
	//利用模式串T的next函数求T在主串S中第pos个字符后的位置,其中T非空
	int i=pos,j=0;
	while(i<strlen(S.ch)&&j<strlen(T.ch))//两个串均未到末尾
	{
		if(j==0||S.ch[i]==T.ch[j])
		++i,++j;
		else j=next[j];//模式串向后移动 
	 } 
	 if(j>=strlen(T.ch)) return i-strlen(T.ch); //匹配成功 
	 else return 0;//匹配失败
 } 
int main()
{
	sstring S,T;
	int pos,ans,next[MAXSIZE];
	printf("请输入主串S:\n");
	scanf("%s",S.ch);
	printf("请输入模式串T:\n");
	scanf("%s",T.ch);
	printf("请输入pos的值:\n");
	scanf("%d",&pos);
	get_next(T,next);  
    ans=Index_KMP(S,T,pos,next);  
 if(ans==0)  
 printf("匹配失败\n");  
 else  
    printf("模式T在主串S中第pos个字符开始第一次出现的位置为:%d\n",ans);  
	return 0;
 } 
 

计算next函数修正值

void get_nexttval(SString T,int nextval())  
{  
    int i,j;  
    i=1;  
    nextval[1]=0;  
    j=0;  
    while(i<T.length)  
    {  
        if(j==0||T.ch[i]==T.ch[j])  
        {  
            ++i;++j;  
            if(T.ch[i]!=T.ch[j])  
              nextval[i]=j;  
            else nextval[i]=nextval[j];  
        }  
        else  
            j=nextval[j];  
    }  
}  

正数置于负数前

#include<algorithm>
using namespace std;
#include <iostream>
void ni(char *str)
{

	if(*str)
	{
	ni(str+1);
	cout<<*str;
	}
}
int main()
{
	char str[10]="nihao";
	ni(str);
	printf("\n");
	return 0;
}

void Arrange(int A[],int n) 
//n个整数存于数组A中,本算法将数组中所有正数排在所有负数的前面
{int i=0,j=n-1,x;  //用类C编写,数组下标从0开始
 while(i<j)
{while(i<j && A[i]>0)  i++;
while(i<j && A[j]<0)  j--;
   if(i<j) {x=A[i]; A[i++]=A[j]; A[j--]=x; }//交换A[i] 与A[j]
}// while(i<j)
 }//算法Arrange结束.

    原文作者:KMP算法
    原文地址: https://blog.csdn.net/idealistic/article/details/52832425
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞