您的位置:首页 > 理论基础 > 数据结构算法

《数据结构》KMP算法程序调试示例-大家看看一定会有收获

2014-11-10 23:52 337 查看
     下面是一位同学的KMP算法程序,调试时运行时出现了一些问题。没有错误但输出不对,找不出原因。

    该同学很用功的,程序写得不错。先赞一下交表杨!

    大家看看算法,并回顾思考一下改的原因。

 同学程序链接:http://blog.csdn.net/zwycaogen/article/details/40948267

#include <iostream>  

using namespace std;  

void GetNext(int longth,char T[],int (&next)[5])     //1.或者将此行的后半部分(&next)改成 int *next,那么后面的static就不变了。

{   int k=-1,j=0;  

    next[0]=-1;  

    while(j<longth)  

    {   if(k==-1 || T[k]==T[j])  

        {   ++k;  

            ++j;  

            next[j]=k;  

        }  

        else  

            k=next[k];  

    }  

}  

int KMP(char S[],char T[],int next[5])  

{    int i=0,j=0;  

    while((S[i]!='\0')&&(T[j]!='\0'))  

    {   if(S[i]==T[j])  

        {   ++i;  

            ++j;  

        }  

        else  

        {   j=next[j];  

            if(j==-1)  

            {   ++i;  

                ++j;  

            }  

        }  

    }  

    if(T[j]=='\0') {  

      //  cout<<"i="<<i<<endl;  //这个语句没意义,是作者调试时加上的,在些删除了。

        return (i-j+1);  

    }  

    else return 0;  

}  

int main()  

{    char S[10]="abcabcacb";  

    char T[6]="abcac";  

    cout<<T[0]<<endl;  

    static int next[5];  //2.或不改上面1,程序只改这个地方面。加了红色内容。

    GetNext(5,T,next);            

    cout<<"T[0]="<<T[0]<<endl;         //这里输出的是空格,为什么呢?应该输出是a 原来的错误地方面

    for(int i=0;i<5;i++)  

        cout<<"next["<<i<<"] = "<<next[i]<<endl;      //这里i=0,j=0 跳过了上面while((S[i]!='\0')&&(T[j]!='\0'))循环  

    cout<<KMP(S,T,next)<<endl;  

    return 0;  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐