Chinaunix首页 | 论坛 | 博客
  • 博客访问: 12950
  • 博文数量: 16
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 170
  • 用 户 组: 普通用户
  • 注册时间: 2013-05-08 11:44
文章分类
文章存档

2014年(16)

我的朋友
最近访客
BM

分类: C/C++

2014-05-02 21:24:31


点击(此处)折叠或打开

  1. /*a中存放bad char下一次对齐的位置*/
  2. void getbc(int a[], int n, const char *s)
  3. {
  4.         int i;
  5.         unsigned char c;
  6.         size_t len = strlen(s);
  7.         for (i = 0; i < n; i++) {
  8.                 a[i] = -1;
  9.         }
  10.     
  11.         for (i = 0; i < len - 1; i++) { //不修改最后一个位置
  12.                 c = (unsigned char)s[i];
  13.                 a[c] = i;
  14.         }
  15. }

  16. /*b中存放b[n-1]要下一次要对齐的位置*/
  17. void getsuf(int b[], int n, const char *s)
  18. {
  19.         int i, first;
  20.         first = -1;
  21.         for (i = n-2; i >= 0; i--) {
  22.                 b[i] = -1;
  23.                 if (s[i] == s[n-1]) {
  24.                         first = i;
  25.                 }
  26.         }
  27.         b[n-1] = n-2;
  28.         for (i = n-2; i >= 0; i--) {
  29.                 if (s[i] == s[n-1]) {
  30.                         int j, k;
  31.                         j = i - 1;
  32.                         k = n - 2;
  33.                         while (s[j] == s[k]) {
  34.                                 j --;
  35.                                 k --;
  36.                                 printf("%c-%c\n", s[j], s[k]);
  37.                                 if (j < 0)
  38.                                         break;

  39.                         }
  40.                         if (b[k] == -1) {
  41.                                 b[k] = i;
  42.                         }
  43.                         printf("i = %d\n", i);
  44. if (j == -1 && i == first) { //最后一个且可以匹配到末尾
  45.                                 while (k-- > 0) {
  46.                                         if (b[k] == -1)
  47.                                                 b[k] = i;
  48.                                 }
  49.                         }
  50.                 }
  51.         }
  52. }
  53. void bm(const char *str, const char *pat)
  54. {
  55.         int n, index;
  56.         int *suf;
  57.         int *bc;

  58.         n = strlen(pat);

  59.         suf = malloc(n * sizeof(int));
  60.         bc = malloc(256 * sizeof(int));
  61.         getbc(bc, 256, pat);
  62.         getsuf(suf, n, pat);

  63.         index = n - 1;
  64.         while (index < strlen(str)) {
  65.                 int i, j;
  66.                 i = index;
  67.                 j = n - 1;
  68.                 while (str[i] == pat[j] && j >= 0) {
  69.                         i--;
  70.                         j--;
  71.                 }
  72.                 if (j == -1) {
  73.                         index = index + 1;
  74.                         printf("match at pos %d\n", i + 1);
  75.                 } else {
  76.                         int max;
  77.                         max = j - bc[str[index]];
  78. // max = n - 1 - bc[str[index]]; //horspool
  79.                         max = max > n - 1 - suf[j] ? max : n - 1 - suf[j];
  80.                         index = index + max;
  81.                 }
  82.         }
  83. }

阅读(175) | 评论(0) | 转发(0) |
0

上一篇:c语言困惑

下一篇:rbtree

给主人留下些什么吧!~~