鱼C论坛

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

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

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

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

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

x
欢迎拍砖哈,代码个数 可使用 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[i] == T[j]) {      // 判断下一个
         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;
}



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

使用道具 举报

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

使用道具 举报

 楼主| 发表于 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[0] = -1;            // next数组第一个元素为-1
    int lenT = strlen(T);   // 字符串长度

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

        }
        else
        {
            j = next[j];
        }
    }
}

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

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

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

    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;
}


想知道小甲鱼最近在做啥?请访问 -> 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-12-24 08:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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