博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实现 Sunday 算法
阅读量:5977 次
发布时间:2019-06-20

本文共 1347 字,大约阅读时间需要 4 分钟。

 

鉴于校园招聘笔试题,有个字符串模式匹配的问题,99+%都是暴力,偶尔一两个写KMP,但是明显是知其表不知其里。期待的 BM算法 或者 Sunday 没有出现!

鉴于网友的回复,特此声明:我的代码假定字符串中的字符都在ASCII范围内
想了解Sunday,可以查作者原著,不难找。
By the way,国内有好多 Paper 是对Sunday的改进,我本人是忽略不计, 国内的Paper擅长这个。
头文件定义:
/* Sunday.h */
class Sunday 
{
public:
   Sunday();
   ~Sunday();
public:
    int find(const char* pattern, const char* text);
private:
    void preCompute(const char* pattern);
private:
    //Let's assume all characters are all ASCII
    static const int ASSIZE = 128;
    int _td[ASSIZE] ;
    int _patLength;
    int _textLength;
};
源文件
/* Sunday.cpp */
Sunday::Sunday()
{
}
Sunday::~Sunday()
{
}
void Sunday::preCompute(const char* pattern)
{
    for(int i = 0; i < ASSIZE; i++ ) 
        _td[i] = _patLength + 1;
    const char* p;
    for ( p = pattern; *p; p++)
        _td[*p] = _patLength - (p - pattern);
}
int Sunday::find(const char* pattern, const char* text)
{
    _patLength = strlen( pattern );
    _textLength = strlen( text );
    if ( _patLength <= 0 || _textLength <= 0)
        return -1;
    preCompute( pattern );
    const char *t, *p, *tx = text;
    while (tx + _patLength <= text + _textLength) 
    {
        for (p = pattern, t = tx; *p; ++p, ++t)
        {
            if (*p != *t)
                break;
        }
        if (*p == 0)
            return tx-text;
        tx += _td[tx[_patLength]]; 
    }
    return -1;
}
简单测试下:
int main()
{
    char* text = "blog.csdn,blog.net";
    char* pattern = "csdn,blog"    ;
    Sunday sunday;
    printf("The First Occurence at: %d\n",sunday.find(pattern,text));
    return 1;
}

 

 

 

 

转载地址:http://ywsox.baihongyu.com/

你可能感兴趣的文章
线程同步之——互斥量及死锁问题
查看>>
Python中列表的copy方法
查看>>
PHP的mongo扩展版本过低导致无法查询
查看>>
Spring boot配置文件 application.properties
查看>>
网络配置之ifconfig及Ip命令详解
查看>>
网站建设案例欣赏_网站制作设计案例_成都辰星建站
查看>>
HP大中华区总裁孙振耀退休感言
查看>>
php excel
查看>>
一些设计思想的汇集(2)
查看>>
GRUB and LVM and EVMS
查看>>
List集合的迭代器方法
查看>>
ECShop替换FCKeditor编辑器为KindEditor
查看>>
oracle 11g EM停止后无法启动
查看>>
面向对象是软件开发范式的根本性颠覆: 主体建模, 非目标导向, 松耦合, 非逻辑分解, 软件进化...
查看>>
OSI七层模型和TCP/IP四层模型
查看>>
ceph学习笔记之七 数据平衡
查看>>
windows下的php的memcache扩展的安装及memcache最新下载地址
查看>>
YOLOv3: 训练自己的数据(绝对经典版本1)
查看>>
Python 自带IDLE中调试程序
查看>>
FireFox and IE CSS兼容要点
查看>>