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