一月一代码 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>

原文地址:https://www.cnblogs.com/titer1/p/2429418.html