用自动机解决字符串的匹配问题

作者在 2011-03-17 08:59:14 发布以下内容
#include<iostream>
using namespace std;
int jmpoftable[100][256];
void Greattable(const char* str, int lenght)//跳转表的建立
{
    int i = 0;
    for(const char *p = str; i<lenght; ++p,++i)
    {
        jmpoftable[i][*p] = i+1;
    }
    
    for(int j = 1; j <= i; ++j)
    {
        int k = 0;
        while(str[k] == str[k+j]) //找出第一个可以不匹配,但前面有k个字条相同,的位置(k+j)
            ++k;
//        cout << k << endl;
        if(k != 0)
        {
            if(jmpoftable[k+j][str[k]] < k+1) //str[k+j] == str[k]的话,就可以跳转至k+1。
                jmpoftable[k+j][str[k]] = k+1;
        }
        if(jmpoftable[j][*str] == 0) //和一个字符相同都可以跳转到1,前提是没有更长的匹配
            jmpoftable[j][*str] = 1;
    }
}
int fun(int index, char c)
{
    return jmpoftable[index][c];
}
int main()
{
    char * cp = "ababababababab";
    int key = 3;
    Greattable("aba",key);
    int p = 0;
    while(*cp)
    {
        p = fun(p,*cp);
        ++cp;
        if(p == key)
        {
            cout.write(cp-key,key);
            cout << endl;
        }
    }
    return 0;
}

我这个跳转表是根据模式字符串与它本身的比较。(str[k+j] 和str[j]的比较)

str1: lintaolinynlintao

str2: *lintaolinynlintao(k的大小就是`*`的数量,在搜寻str2的前缀字符串)

跳转表的建立没经过证明,不知道有没有错误。(我已经想不了了,脑袋都糊了)

期待高手们给指出问题,或者帮忙解释下算法导论里他的变迁表(跳转表)是什么建立的。

默认分类 | 阅读 1404 次
文章评论,共0条
游客请输入验证码
浏览30050次