ZhaoYuBetter 发表于 2014-9-29 23:07:44

BF 算法总感觉写法怪怪的,改了一下

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

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

typedef char* String;

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

   while(i<lenS && j<lenT) {
      if(S == T) {      // 判断下一个
         i++;
          j++;
   } else {      // 回溯
      i = i-j+1;
      j = 0;
   }
    }

    if(j > lenT - 1) {
    return i - lenT;
    } else {
    return -1;
}
}

int main()
{
    int i;
    i = index("Helloo", "lo", 0);
    printf("index: %d", i);
    return 0;
}




ZhaoYuBetter 发表于 2014-9-29 23:08:31

一般编程语言,都是 返回 -1 表示匹配不到的意思。

ZhaoYuBetter 发表于 2014-10-2 20:35:49

修改好的 KMP 算法:#include <stdio.h>
#include <stdlib.h>

typedef char* String;


// KMP 算法start
/*
获取 KMP 的 next 数组
*/
void getNext(String T, int *next)
{
    int j = -1;// 前
    int i = 0;// 后

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

    while( i < lenT)
    {
      // 刚开始or匹配相等加1向前走(BF原則)
      if(-1==j || T == T)
      {
            j++;
            i++;
            if(T != T)
            {
                next = j;    // 填下一个
            }
            else
            {
                next = next;
            }

      }
      else
      {
            j = next;
      }
    }
}

// 返回子串T在主串S第pos个字符之后的位置
// 若存在,返回-1
int indexKMP(String S, String T, int pos)
{
    int i = pos;
    int j = 0;
    int next;

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

    while(i<lenS && j<lenT)
    {
      if(-1 == j || S == T) //j=-1,没有这个元素,指向下一个元素,类似BF算法
      {
            i++;
            j++;
      }
      else            // 匹配失败
      {
            j = next;
      }
    }

    if(j > lenT - 1)
    {
      return i - lenT;
    }
    else
    {
      return -1;
    }


}


// KMP 算法end

int main()
{

    i =indexKMP("ababaaabacca", "aaaa", 0);
    printf("KMP, index: %d ", i);
    printf("\n");
    return 0;
}



大个的糖果 发表于 2014-11-1 01:38:32

磨牙耗子 发表于 2018-4-24 15:08:20

4#说的啥、
页: [1]
查看完整版本: BF 算法总感觉写法怪怪的,改了一下