模式匹配

朴素的模式匹配

 

无回溯的模式匹配

  1. ///最大前缀和对大后缀的相等长度为k,
  2. ///无回溯的模式匹配即给匹配字符串上字符加上标记。 
  3. ///长度为n的字符串char string[n]有长度为n的标记数组int flag[n]。
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. struct seqlist;
  8. typedef char DataType;
  9. typedef struct seqlist *plist;
  10. struct seqlist
  11. {
  12.     int maxsize;
  13.     int n;
  14.     DataType * element;
  15. };
  16. plist createNullList_Seq(int m)
  17. {
  18.     plist pl = (plist)malloc(sizeof(struct seqlist));
  19.     
  20.     if(pl != NULL)
  21.     {
  22.         pl -> element = (DataType *)malloc(sizeof(char)*m);
  23.         
  24.         if(pl -> element != NULL)
  25.         {
  26.             pl -> maxsize = m;
  27.             pl -> n = 0;
  28.             return pl;
  29.         }
  30.         else 
  31.             free(pl);
  32.     }
  33.     else
  34.         printf("Over flow!/n");
  35.     
  36.     return  NULL;   
  37. }
  38. void makeFlag(plist ps, int *flag)
  39. {
  40.     int i = 0, k = -1;
  41.     
  42.     flag[0] = -1;
  43.     
  44.     while(i < ps -> n - 1){
  45.         while(k >= 0 && ps -> element[i] != ps -> element[k])
  46.             k = flag[k];
  47.     i++;
  48.     k++;
  49.     
  50.     flag[i] = k;
  51.     }
  52. }
  53. int pMatch(plist ts, plist ps, int *flag)
  54. {
  55.     int i = 0, j = 0;
  56.     while(i < ps -> n && j < ts -> n)
  57.         if(i == -1 || ps -> element[i] == ts -> element[j])
  58.         {
  59.             i ++;
  60.             j ++;
  61.         }
  62.         else 
  63.         {
  64.             i = flag[i];
  65.         }
  66.     if(i >= ps -> n)
  67.         return (j - ps -> n + 1);
  68.     else
  69.         return 0;
  70. }
  71. int main(int argc, char ** argv)
  72. {
  73.     plist ts = createNullList_Seq(15);
  74.     ts -> n = 14;
  75.     
  76.     plist ps = createNullList_Seq(6);
  77.     ps -> n = 5;
  78.     
  79.     char b[] = "abcab"
  80.     char a[] = "abcadabcabbaaf";
  81.     strcpy(ps ->element, b);
  82.     strcpy(ts ->element, a);
  83.     
  84.     int i;
  85.     int flag[5];
  86.     makeFlag(ps, flag);
  87.     int index = 0;
  88.     index = pMatch(ts, ps, flag);
  89.     printf("%d/n", index);
  90.     return 0;
  91. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值