字符串普通模式匹配和KMP模式匹配[面相对象喽]

    技术2022-05-11  47

    学校的课程设计,本来可以简简单单的描述一下就好了。但是这学期不是面向对象了吗?那么为什么不用面向对象来画蛇添足一下呢?笨笨可可捅鼓了到很晚,贴出来做个纪念。

    程序说明:

    实现对输入的两个字符串,一个主串一个子串...进行模式匹配.check是普通模式匹配,kmpcheck是KMP算法模式匹配.所以会有两个输出结果,理论上两个结果应该是一致的,实际操作中也是一样...反正我试了几组都没出错...程序简单,没写注释,懒一把.

    VC++ 6.0下测试通过

    源代码:

    //CheckString.h

    class CheckString{ char key;public: char s[20]; int len; int viewhead; int viewend; void input(); void check(const CheckString &substring); void kmpcheck(const CheckString &substring); void viewnext();};

    //main.cpp

    #include <iostream.h>#include "CheckString.h"

    void main(){ CheckString mainstring; CheckString substring; cout<<"输入主串:"<<endl; mainstring.input(); cout<<"输入子串:"<<endl; substring.input(); cout<<"普通模式匹配算法开始:"<<endl; mainstring.check(substring); cout<<"KMP模式匹配算法开始:"<<endl; mainstring.kmpcheck(substring);}

    //CheckString.cpp

    #include<iostream.h>#include<stdio.h>#include "CheckString.h"void CheckString::input(){  len=0; while((key=getchar())!='/n') {  s[++len]=key; }}

    void CheckString::check(const CheckString &substring){ int i=1,j=1; while(i<=len) {  if(s[i++]==substring.s[j])  {   j++;   if(j>substring.len)break;  }  else  {   j=1;  } } if(j>substring.len) {  viewhead=i-substring.len;  viewend=viewhead+substring.len-1;  cout<<"满足匹配起始位置:"<<viewhead<<endl;  cout<<"满足匹配结束位置:"<<viewend<<endl<<endl; } else  cout<<"没有一样的啊!!"<<endl<<endl;}

    void CheckString::kmpcheck(const CheckString &substring){ int i=1,j=1; int k=0; int next[20]; next[1]=0; while(j<substring.len)  if((k==0)||(substring.s[j]==substring.s[k]))  {   j++;   k++;   next[j]=k;  }  else   k=next[k]; cout<<"输出next[]数组:"; for(i=1;i<=substring.len;i++)  cout<<next[i]; cout<<endl; i=1;j=1; while((i<=len)&&(j<=substring.len))  if((j==0)||(s[i]==substring.s[j]))  {   i++;   j++;  }  else   j=next[j]; if(j>substring.len) {  viewhead=i-substring.len;  viewend=viewhead+substring.len-1;  cout<<"满足匹配起始位置:"<<viewhead<<endl;  cout<<"满足匹配结束位置:"<<viewend<<endl<<endl; } else  cout<<"没有一样的啊!!"<<endl<<endl;}

    完事儿。^_^


    最新回复(0)