66 | 不是为背代码而来 |
|
| 代码 注释尽在不言中 |
|
希望: | 过acm KMP算法的练习题(poj 3461、poj 2752、poj 2406、poj 1961) |
|
继续 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>