用处:对于一个较长的字符串A,判断A中是否存在字符串B。
思路:
暴力的做法是从A的每个元素开始,依次比较看是否有和B相同的子串,时间复杂度是o(N*N)
优化思路是对于每次查找完成以后,下一次比较的位置不一定要从当前比较的头部的下一个位置开始,而是可以从其余地方开始,也就是B可以一次移动多个位置再比较。那么,B如何移动多个位置呢?这就和B的字符串本身有关,假设ne[j]=i,表示从0-i的字符串和从j-i到j的字符串是一致的,则此时就无需再比较0-i的所有元素了,也就是简化了比较次数。
那么,该如何求跳转的函数ne?
本次规定字符串下标从0开始!!
ne[0]=-1;//表示到0还匹配不成功则没有可以匹配的子串
for(int i=1,j=-1;i<lenb;i++)
{while(j+1&&B[i]!=B[j+1]) //若当前j位置不能匹配成功j=ne[j];if(B[i]==B[j+1])j++;ne[i]=j;
}
对于匹配A的过程,就是每次B的j+1位置和A的i位置匹配不成功,则j跳转到ne[j]重新匹配。
for(int i=0,j=-1;i<lenA;i++)
{while(j+1&&A[i]!=B[j+1])j=ne[j];if(A[i]==B[j+1])j++;if(j==lenB-1) //匹配成功{int low=i-lenB+1;//匹配成功的下标j=ne[j]; //继续找下一个匹配下标}}