您的位置:首页 > 汽车 > 时评 > 网站制作模板软件_东莞大型企业网站建设_兔子bt搜索_百度搜索结果

网站制作模板软件_东莞大型企业网站建设_兔子bt搜索_百度搜索结果

2025/6/27 1:25:29 来源:https://blog.csdn.net/yyssas/article/details/142467484  浏览:    关键词:网站制作模板软件_东莞大型企业网站建设_兔子bt搜索_百度搜索结果
网站制作模板软件_东莞大型企业网站建设_兔子bt搜索_百度搜索结果

用处:对于一个较长的字符串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]; //继续找下一个匹配下标}}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com