字符串的匹配BF法

 

  
  
  
  
  1. #include <stdio.h>  
  2. #include<string.h>  
  3. int main()  
  4. {  
  5.     int i,k,l1,l2,ii,j,leap;  
  6.     char s1[1001],s2[1001];  
  7.     while(gets(s1)!=NULL)  
  8.     {  
  9.         gets(s2);  
  10.         l1=strlen(s1);  
  11.         l2 = strlen(s2);  
  12.         leap =0;  
  13.  
  14.         for(i= 0;i <= l1-l2;i++)  //i是可以到l1-l2的它在l1-l2上在做一次比较
  15.         {  
  16.             ii = 0;j = 0;  
  17.             while(ii < l1&&j < l2)  
  18.             {  
  19.                 if(s1[ii] == s2[j])  
  20.                 {  
  21.                     ii++;j++;  
  22.                 }  
  23.                 else 
  24.                 {  
  25.                     ii = ii-j+1;j = 0;  //ii从开始有相等的地方再次向后移动
  26.                 }  
  27.             if(j == l2)  //而不是l2-1
  28.             {  
  29.                 leap = 1;break;  
  30.             }  
  31.             else 
  32.                 leap=0;  
  33.                   
  34.             }  
  35.             if(leap)  
  36.                 break;  
  37.  
  38.               
  39.         }  
  40.         if(leap == 0)  
  41.         {  
  42.             printf("NO\n");  
  43.         }  
  44.         else 
  45.         {  
  46.             printf("YES\n");  
  47.         }  
  48.     }  
  49. }  
  
  
  
  
  1. //算法功能:串的朴素模式匹配是最简单的一种模式匹配算法,又称为 Brute Force 算法,简称为BF算法  
  2.  
  3. #include <stdio.h>  
  4. #include <stdlib.h>  
  5. #define MAXL 255  
  6. #define FALSE 0  
  7. #define TRUE 1  
  8.  
  9. typedef int Status;  
  10. typedef unsigned char SString[MAXL+1];  
  11.  
  12. //生成一个其值等于串常量strs的串T  
  13. void StrAssign(SString &T, char *strs)  
  14. {  
  15.         int i;  
  16.         T[0] = 0;   //0号单元存储字串长度  
  17.         for(i = 0; strs[i]; i++)   //用数组strs给串T赋值  
  18.                 T[i+1] = strs[i];  
  19.         T[0] = i;  
  20. }  
  21.  
  22. //返回子串T在主串S中第pos个字符开始匹配的位置,若不存在,则返回0  
  23. int Index(SString S, SString T, int pos)  
  24. {  
  25.         int i = pos, j = 1;  
  26.         while(i <= S[0] && j <= T[0])  
  27.         {  
  28.                 if(S[i] == T[j])    //继续比较后面的字符  
  29.                 {  
  30.                         i++;  
  31.                         j++;  
  32.                 }  
  33.                 else    //指针回退,重新开始匹配  
  34.                 {  
  35.                         i = i -j + 2;  
  36.                         j = 1;  
  37.                 }  
  38.         }  
  39.         if(j > T[0])  
  40.                 return i - T[0];  
  41.         else 
  42.                 return 0;  
  43. }  
  44.  
  45.  
  46. int main()  
  47. {  
  48.         SString S, T;  
  49.         int m;  
  50.         char strs1[MAXL];   //建立主串S  
  51.         char strs2[MAXL];   //建立模式串T  
  52.         printf("请输入主串和子串:\n");  
  53.         printf("主串S: ");  
  54.         scanf("%s", strs1);  
  55.         printf("子串T: ");  
  56.         scanf("%s", strs2);  
  57.  
  58.         StrAssign(S, strs1);  
  59.         StrAssign(T, strs2);  
  60.  
  61.         m = Index(S, T, 1);  
  62.         if(m)  
  63.                 printf("主串 S = {%s}\n子串 T = {%s}\n在第 %d 个位置开始匹配!\n", strs1, strs2, m);  
  64.         else 
  65.                 printf("主串 S = {%s}\n子串 T = {%s}\n匹配不成功!\n", strs1, strs2);  
  66.         return 0;  
  67. }  

 

 

 

 

你可能感兴趣的:(字符串,职场,休闲,BF)