kmp模板
来源:互联网 发布:重庆大学网络教学平台 编辑:程序博客网 时间:2024/06/05 08:05
字符串查重,先定义2个字符串str1,str2。str1为被比较的长串,str2为短串。先通过str2对自身的比较得出一组数字下标,记录在next数组里(具体操作下文说明)。然后再进行str1,与str2的比较,这样在进行比较时长串的游标就不会回溯,只往下移。详情请看下文。
首先是str2的自我比较得next数组:
如图i为前串游标,j为后串游标,错开一个表示前后,然后逐个比较。如果后串是首位(即j=0)当前i位所指next[i]=1,如果当前相同则i++;j++;如果之前部分对应一致,则当前next[i]=j;具体代码如下:
<span style="white-space:pre"></span>l2=strlen(str2); i=1;j=0;next[1]=0; while(i<=l2) { if(j==0||str2[i-1]==str2[j-1]) { i++; j++; next[i]=j; } else{ j=next[j]; } }然后在比较str2与str1:
如果遇到
直接通过next数组将str2串跳到j=2的位置,在进行比较。如果是普通算法会直接变成i=4的为,同时j回到第1位,再开始比较。而kmp不需要i游标的回溯,这样在处理长串时,效率无疑提高不少。具体代码如下:
l1=strlen(str1); i=0;j=0; while(i<=l1&&j<=l2) { if(j==0||str1[i-1]==str2[j-1]) { i++; j++; } else j=next[j]; }最后判断j的大小如果j>l2则说明str1中存在串2;
例题SDUTOJ 2772http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2772
题目描述
给定两个字符串string1和string2,判断string2是否为string1的子串。
输入
输入包含多组数据,每组测试数据包含两行,第一行代表string1(长度小于1000000),第二行代表string2(长度小于1000000),string1和string2中保证不出现空格。
输出
对于每组输入数据,若string2是string1的子串,则输出string2在string1中的位置,若不是,输出-1。
示例输入
abca12345645abcddd
示例输出
14-1
代码如下:
#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){ int i,j,l1,l2,next[1000000]; char str1[1000001],str2[1000001]; while(~scanf("%s%s",str1,str2)) { l2=strlen(str2); i=1;j=0;next[1]=0; while(i<=l2) { if(j==0||str2[i-1]==str2[j-1]) { i++; j++; next[i]=j; } else{ j=next[j]; } } l1=strlen(str1); i=0;j=0; while(i<=l1&&j<=l2) { if(j==0||str1[i-1]==str2[j-1]) { i++; j++; } else j=next[j]; } if(j>l2)printf("%d\n",i-j+1); else printf("-1\n"); } return 0;}
0 0
- KMP模板
- KMP 模板
- kmp模板
- kmp模板
- kmp模板
- KMP模板
- kmp模板
- kmp模板
- KMP 模板
- 【模板】KMP
- KMP模板
- KMP模板
- 【KMP 模板】
- KMP模板
- KMP 模板
- kmp模板
- KMP模板
- KMP 模板
- Exploring Beautiful Lake Geneva(3/3) -- 探索美丽的日内瓦湖(三)
- 键盘党的福音 史上最全win8快捷键大集合
- 浅谈五大Python Web框架
- 设计用例的方法、依据有那些
- 使用匿名类直接new接口
- kmp模板
- wpf自定义按钮样式
- 帮助文档(*.chm)制作 以及在winform程序中的应用
- HDU 3635-Dragon Balls(高级并查集)
- 兼容各大浏览器的js 数组删除元素方法方法
- Spring连接MySQL、Oracle和SQL Server的数据库运动连接属性
- A. Appleman and Easy Task 8-26
- Tchart的横纵坐标最大和最小值如何用语句设置Tchart的横纵坐标最大和最小值
- 遍历Map四种