针对于next[]算法思路的考虑,其实在下标i失配时,比较下标i-1与前面的匹配情况找到最好匹配对象存在next[i]=j。当我们再比较T[i]、T[j],相等跳过匹配,不相等做该做的匹配操作。

下面是代码

 1 void getnextval_2(char T[],int nextval[]){//直接相当于舍弃next求法,直接求nextval,不借助next[],直接优化比较,并且直接递推下去; 教材的方法
 2     int i,j;
 3     i=0;
 4     j=-1;
 5     nextval[0]=-1;
 6 
 7     while(i<strlen(T)){
 8         if(j==-1||T[i]==T[j]){
 9             i++;
10             j++;
11 
12             /**///——>重点理解地带:直接在T[]上求nextval,同于next[]的思想
13             if(T[i]!=T[j]){   //前一个判断,求的与next一样,i++后,比较当前T[i]T[j]
14                 nextval[i]=j;//不等,存储入nextval
15             }
16             else{
17                 nextval[i]=nextval[j];//相等,不用比较,跳过;nextval是从头开始递推的,每个值都是最优的
18             }
19             /**/
20 
21         }
22         else{
23             j=nextval[j];
24         }
25     }
26 }
View Code

 

  其实本质上思路与求next[]的想法一致,就只是在应该赋值进入next时,做一次比较,T[i]、T[j],相等跳过匹配,不相等做该做的匹配操作。又由于基本算法是从递推关系出来的,相等,赋值前一个nextval[],不相等,直接赋值。

 

当若想借助next,求nextval