鱼C论坛

 找回密码
 立即注册
查看: 2966|回复: 4

[技术交流] BF 算法总感觉写法怪怪的,改了一下

[复制链接]
发表于 2014-9-29 23:07:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
欢迎拍砖哈,代码个数 可使用 codeblok 格式化一下:算法学起来比较吃力。。。:cry

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef char* String;

  4. // 返回子串T在主串S中第pos个字符之后的位置
  5. // 若不存在,则返回0
  6. // T非空,1 <= pos <= strlen(S)
  7. int index(String S, String T, int pos)
  8. {
  9.       int i = pos;
  10.       int j = 0;
  11.       int lenS = strlen(S);
  12.       int lenT = strlen(T);

  13.      while(i<lenS && j<lenT) {
  14.       if(S[i] == T[j]) {      // 判断下一个
  15.          i++;
  16.           j++;
  17.      } else {        // 回溯
  18.         i = i-j+1;
  19.         j = 0;
  20.      }
  21.     }

  22.     if(j > lenT - 1) {
  23.     return i - lenT;
  24.     } else {
  25.     return -1;
  26. }
  27. }

  28. int main()
  29. {
  30.     int i;
  31.     i = index("Helloo", "lo", 0);
  32.     printf("index: %d", i);
  33.     return 0;
  34. }
复制代码




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-9-29 23:08:31 | 显示全部楼层
一般编程语言,都是 返回 -1 表示匹配不到的意思。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-2 20:35:49 | 显示全部楼层
修改好的 KMP 算法:
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef char* String;


  4. // KMP 算法start
  5. /*
  6. 获取 KMP 的 next 数组
  7. */
  8. void getNext(String T, int *next)
  9. {
  10.     int j = -1;  // 前
  11.     int i = 0;  // 后

  12.     next[0] = -1;            // next数组第一个元素为-1
  13.     int lenT = strlen(T);   // 字符串长度

  14.     while( i < lenT)
  15.     {
  16.         // 刚开始or匹配相等加1向前走(BF原則)
  17.         if(-1==j || T[i] == T[j])
  18.         {
  19.             j++;
  20.             i++;
  21.             if(T[i] != T[j])
  22.             {
  23.                 next[i] = j;    // 填下一个
  24.             }
  25.             else
  26.             {
  27.                 next[i] = next[j];
  28.             }

  29.         }
  30.         else
  31.         {
  32.             j = next[j];
  33.         }
  34.     }
  35. }

  36. // 返回子串T在主串S第pos个字符之后的位置
  37. // 若存在,返回-1
  38. int indexKMP(String S, String T, int pos)
  39. {
  40.     int i = pos;
  41.     int j = 0;
  42.     int next[255];

  43.     getNext(T, next);   // 获取next数组
  44.     int lenS = strlen(S);
  45.     int lenT = strlen(T);

  46.     while(i<lenS && j<lenT)
  47.     {
  48.         if(-1 == j || S[i] == T[j]) //j=-1,没有这个元素,指向下一个元素,类似BF算法
  49.         {
  50.             i++;
  51.             j++;
  52.         }
  53.         else            // 匹配失败
  54.         {
  55.             j = next[j];
  56.         }
  57.     }

  58.     if(j > lenT - 1)
  59.     {
  60.         return i - lenT;
  61.     }
  62.     else
  63.     {
  64.         return -1;
  65.     }


  66. }


  67. // KMP 算法end

  68. int main()
  69. {

  70.     i =  indexKMP("ababaaabacca", "aaaa", 0);
  71.     printf("KMP, index: %d ", i);
  72.     printf("\n");
  73.     return 0;
  74. }
复制代码



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2014-11-1 01:38:32 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-24 15:08:20 | 显示全部楼层
4#说的啥、
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-18 11:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表