• 一月一代码 3月 kmp 领悟代码


    66

    不是为背代码而来

     

     

    代码 注释尽在不言中

     

    希望:

    acm

    KMP算法的练习题(poj 3461、poj 2752、poj 2406、poj 1961)

    http://blog.csdn.net/lalor/article/details/7358956

     

     

    继续 heap ,qsort后,再发表

    int kmp_find_vJuly(const string & target, const string & pattern)

    /************************************************************************/

    /* input

    output

    要求:为了纠正图,可否把target 打印出来?

    */

    /************************************************************************/{

    const int target_length=target.size();

    const int pattern_length=pattern.size();

    int *overlay_value=new int[pattern_length];

    overlay_value[0]=-1;

    int index=0;

    //    1/2

    //compute overlay 数组

    for (int i=1; i<pattern_length ; ++i)

    {

    index=overlay_value[i-1];

    //

    //这里证明了函数里那个不幸运的递归在此。

    //这里的输出index 是为了pattern[i] 比配。。

    //2012-3-31 9:48:22,我用代码覆盖的方法思考这里,

    while ( index>=0 && pattern[index+1] !=pattern[i])

    //这里条件就可以思考这里的分支,幸运的相等,或者index 直接打回老家变负数

    {

    index=overlay_value[index];

    //如果再品论a0 ak; aj-k...aj...k要尽量小,这里可以看出来,从最近的index开始反推。

    //每一个overlay_value都是可以使 当前自我覆盖达到最大值。

    }//end while

    //分支luky

     

    if (pattern[index+1] == pattern[i])

    {

    overlay_value[i]=index+1;

    //其实,这么多分支,不都是为了计算overlay_value[i]

    }

    else{

    overlay_value[i]=-1; //!干脆

    }

    }//end for

    // 2/2

    //compute kmp

    //x :作者vjuly kmp最大的好处,不用移动pattern游标??验证

     

     

    int pattern_index=0;

    int target_index=0;

    while( pattern_index < pattern_length &&

    target_index < target_length){

    cout<<"pattern_index: "<<pattern_index<<endl;

    if ( target[target_index] ==pattern[pattern_index] )

    //luky one

    {

    ++target_index;

    ++pattern_index;

    cout<<"debug luky target_index: "<<target_index<<endl;

    }

    else if( pattern_index ==0){

    ++target_index; //?? 66分析,这说明刚才pattern_index 开始,或者被打到老家了

    cout<<"when pattern_index ==0 ,debug target_index: "<<target_index<<endl;

    //2012-3-31 10:05:38 budong

    }

    else{

    pattern_index=overlay_value[pattern_index -1] +1;

    cout<<"when overlay ,debug target_index: "<<target_index<<endl;

    //2012-3-31 10:01:05

    //还没理解这个方法。如何使用这个

    //2012-3-31 10:03:29

    // 这里就是唯一使用overlay_value的地方

    //当不能前进。。回退就使用自我覆盖数组啊!!。。最大的发现

    //

     

    }

    }//end while

    //

    //

    if (pattern_index ==pattern_length)

    {

    return target_index-pattern_index;

    }

    else{

    return -1;

    }

    //深入

    //2012年月日:06:31 结尾

    //这里能找到所有的匹配类型嘛?adv

    //不仅仅一个..像百度博客里,多个子字符串的概念啦?

    //

    }

    void 算法导论_kmp()

    /************************************************************************/

    /* 2012-3-31 9:42:23 主函数

    input 测试用例额: annbcdanacadsannannabnna annacanna

    来自vjuly 博客

    */

    /************************************************************************/

    {

    string src="annbcdanacadsannannabnna";

    string pattern="annacanna";

    cout<<kmp_find_vJuly(src,pattern)<<endl;

    //奖励简单有kmp animation or demonstration?

    }

     

    源文档 <file:///C:\Documents%20and%20Settings\Administrator\桌面\新建%20Microsoft%20Office%20Word%20文档.docx>

  • 相关阅读:
    ASP.NET学习笔记之VS操作使用技巧
    无线干扰的防止和消减要领总结
    小米蝈蝈 vs 巍
    struts2学习笔记一struts2标签学习
    魏飞
    Hibernate+Mysql在向数据库中保存 / 更新数据时设置编码格式
    程序员爱情 猿女友们,很幸福吗???
    人生
    外链?存储?这个好不好用,fileupyours,fileden,skydrive
    实现网页中增加刷新按钮、链接的方法 搜集
  • 原文地址:https://www.cnblogs.com/titer1/p/2429418.html
Copyright © 2020-2023  润新知