串的模式匹配

串的模式匹配,第1张

概述串的模式匹配

下面是内存溢出 jb51.cc 通过网络收集整理的代码片段。

内存溢出小编现在分享给大家,也给大家做个参考。

#include<stdio.h>#include <stdlib.h>#include<string.h>#define max 100typedef unsigned char sstring[max+1]; //简单模式匹配int Index(sstring S,sstring T,int pos) {     // 返回子串T在主串S中第pos个字符之后的位置。// 若不存在,则函数值为0。// 其中,T非空,1≤pos≤StrLength(S)。 int i = pos;int j = 1;    while (i <= S[0] && j <= T[0]) {      if (S[i] == T[j]) {  // 继续比较后继字符         ++i;         ++j;      } else {  // 指针后退重新开始匹配         i = i-j+2;         j = 1;       }         }   if (j > T[0])      return i-T[0];   else      return 0;}//计算它的next值voID get_next(sstring T,int *next) {    int i=1;  next[1]=0;  int j=0;    while (i<T[0]) {    if(j==0 || T[i]== T[j]) {        ++i;          ++j;          next[i] = j;    }      else     j= next[j];           }} int Index_KMP(sstring S,int pos,int next[]) {     // 利用模式串T的next函数求T在主串S中第pos个字符之后的位置的  // KMP算法。其中,T非空,1≤pos≤StrLength(S)。   int i = pos;  int j = 1;   while (i <= S[0] && j <= T[0]) {    if (j == 0 || S[i] == T[j]) {  // 继续比较后继字符      ++i;  ++j;    } else j = next[j]; // 模式串向右移动  }  if (j > T[0])   return  i-T[0];   // 匹配成功  else   return 0;} // Index_KMPvoID StrAssign(sstring &T,char s[]){       int i=0;       T[0]=strlen(s);       for(i=1;i<T[0]+1;i++)       {              T[i]=s[i-1];       }}int main(){ printf("1.输入一个主串S\n2.输入一个模式串T\n3. 计算模式串T的next函数值,并按格式显示出next函数值\n4.实现简单模式匹配 \n5.实现KMP模式匹配\n6. 继续/否?(y/n?)\n");        int case;sstring S;//主串sstring T;//模式串int next[255];//next[]值               while(1)       {              printf("请输入1到6\n");              scanf("%d",&case);              if(case ==1)              {                     printf("请输入一个主串\n");                     char Str[max];                     scanf("%s",Str);                     StrAssign(S,Str);              }              else if(case ==2)              {                     printf("请输入一个模式串\n");                     char Str[max];                     scanf("%s",Str);                     StrAssign(T,Str);              }              else if(case ==3)              {                     int i;                     get_next(T,next);                     for(i=1;i<T[0]+1;i++)                     {                            printf("%5d",next[i]);                            if(i==5)                                   printf("\n");                     }              }              else if(case ==4)              {                     int pos=1;                     printf("%d",Index(S,T,pos));                     printf("\n");              }              else if(case ==5)              {                     int pos=1;                     printf("%d",Index_KMP(S,pos,next));                     printf("\n");              }              else if(case ==6)              {                     exit(0);              }              else              {              printf("输入的字符非法\n");              }       }       return 0;}

以上是内存溢出(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

总结

以上是内存溢出为你收集整理的串的模式匹配全部内容,希望文章能够帮你解决串的模式匹配所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1277908.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存