模式比對的幾種演算法(含KMP演算法)

來源:互聯網
上載者:User

 #include<stdio.h>   #include<string.h>   #include<stdlib.h>   int failure[100];//失配函數   int strmatch_bf(char *s,char *t)  {      //簡單模式比對,基本思想:將s和t進行比較,如果相等繼續比較,否則t從頭開始,s從i-j+1開始       int i,j;      i=j=0;      while((i < int(strlen(s))) && (j < int(strlen(t))))      {          if(s[i]==t[j])          {              i++;              j++;          }          else          {              i=i-j+1;              j=0;          }      }      if(j>=int(strlen(t)))          return strlen(s)-i;      else          return -1;  }     int endmatch(char *s,char *t)  {//先檢測末端標記的模式比對方法             int i,j,start=0;      int lasts=strlen(s)-1;      int lastt=strlen(t)-1;      int end=lastt;      for(i=0;end<=lasts;end++,start++)      {          if(s[end]==t[lastt])              for(j=0,i=start;j<lastt&&s[i]==t[j];i++,j++);              if(j==lastt)                  return start;//匹配成功       }      return -1;  }  int pmatch_kmp(char *string,char *pat)  {      int i=0,j=0;      int lens=strlen(string);      int lenp=strlen(pat);      while(i<lens&&j<lenp)      {          if(string[i]==pat[j])          {              i++;j++;          }          else  if(j==0)  i++;          else j=failure[j-1]+1;        }      return ((j==lenp)?(i-lenp):-1);  }  void fail(char *pat)  {      int n=strlen(pat);      int i,j;      failure[0]=-1;      for(j=1;j<n;j++)      {          i=failure[j-1];          while((pat[j]!=pat[i+1])&&(i>=0))              i=failure[i];          if(pat[j]==pat[i+1])              failure[j]=i+1;          else              failure[j]=-1;      }  }  int main()  {      int x;      char s[100],t[100];      scanf("%s",s);      scanf("%s",t);      fail(t);      x=strmatch_bf(s,t);      printf("%d\n",x);      x=endmatch(s,t);      printf("%d\n",x);      x= pmatch_kmp(s,t);      printf("%d\n",x);      return 0;  }  #include<stdio.h>#include<string.h>#include<stdlib.h>int failure[100];//失配函數int strmatch_bf(char *s,char *t){//簡單模式比對,基本思想:將s和t進行比較,如果相等繼續比較,否則t從頭開始,s從i-j+1開始int i,j;i=j=0;while((i < int(strlen(s))) && (j < int(strlen(t)))){if(s[i]==t[j]){i++;j++;}else{i=i-j+1;j=0;}}if(j>=int(strlen(t)))return strlen(s)-i;elsereturn -1;}int endmatch(char *s,char *t){//先檢測末端標記的模式比對方法int i,j,start=0;int lasts=strlen(s)-1;int lastt=strlen(t)-1;int end=lastt;for(i=0;end<=lasts;end++,start++){if(s[end]==t[lastt])for(j=0,i=start;j<lastt&&s[i]==t[j];i++,j++);if(j==lastt)return start;//匹配成功}return -1;}int pmatch_kmp(char *string,char *pat){int i=0,j=0;int lens=strlen(string);int lenp=strlen(pat);while(i<lens&&j<lenp){if(string[i]==pat[j]){i++;j++;}else  if(j==0)  i++;else j=failure[j-1]+1;}return ((j==lenp)?(i-lenp):-1);}void fail(char *pat){int n=strlen(pat);int i,j;failure[0]=-1;for(j=1;j<n;j++){i=failure[j-1];while((pat[j]!=pat[i+1])&&(i>=0))i=failure[i];if(pat[j]==pat[i+1])failure[j]=i+1;elsefailure[j]=-1;}}int main(){int x;char s[100],t[100];scanf("%s",s);scanf("%s",t);fail(t);x=strmatch_bf(s,t);printf("%d\n",x);x=endmatch(s,t);printf("%d\n",x);x= pmatch_kmp(s,t);printf("%d\n",x);    return 0;}

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.