数据结构实验之串一:KMP简单应用
2017-01-16 12:20
295 查看
Problem Description
给定两个字符串string1和string2,判断string2是否为string1的子串。Input
输入包含多组数据,每组测试数据包含两行,第一行代表string1(长度小于1000000),第二行代表string2(长度小于1000000),string1和string2中保证不出现空格。Output
对于每组输入数据,若string2是string1的子串,则输出string2在string1中的位置,若不是,输出-1。Example Input
abc a 123456 45 abc ddd
Example Output
1 4 -1
#include<stdio.h>
#include<string.h>
char str1[1000000], str2[1000000];
int next[1000001];
void getnext (int len2)
{
int j,k;
j=0;k=-1;
next[j]=k;
while(j<len2)
{
if(k==-1||str2[j]==str2[k])
{
next[++j]=++k;
}
else
{
k=next[k];
}
}
}
int kmp_count(int len1, int len2)
{
int i,j;
int ans=0;
j=0;
getnext(len2);
for(i=0;i<len1;i++)
{
while(j>0&&str2[j]!=str1[i])
{
j=next[j];
}
if(str1[i]==str2[j])
{
j++;
}
if(j==len2)
{
ans=i-len2+1+1;
break;
}
}
return ans;
}
int main()
{
int len1,len2;
int ans;
while(scanf("%s%s",str1,str2)!=EOF)
{
memset(next,0,sizeof(next));
len1=strlen(str1);
len2=strlen(str2);
ans=kmp_count(len1,len2);
if(ans==0)
printf("-1\n");
else
printf("%d\n",ans);
}
return 0;
}
相关文章推荐
- 数据结构中二叉树的c++实现
- Redis内部数据结构详解之字典(dict)
- 详细讲解redis数据结构(内存模型)以及常用命令
- STL数据结构中的erase问题
- 数据结构之停车管理系统问题
- 数据结构和算法——二叉树
- hdu 5997 rausen loves cakes [启发式合并+树状数组/线段数]【杂类+数据结构】
- UOJ164 V 线段树历史查询
- 顺序表和链表的比较
- 数据结构实验之链表八:Farey序列
- 数据结构实验之链表三:链表的逆置
- 【数据结构与算法】 一些知识点零零总总(引用网络知识点节选重组)
- 从数组到 HashMap 之算法解释
- 程序员面试金典——解题总结: 9.14Java 14.6实现CircularAray类,支持类似数组的数据结构,这些数据结构可以高效地进行旋转
- 数据结构之【栈】以及【模板类】基础练习
- 【数据结构与算法】 有向图的最短路径实现
- js处理层级数据结构的一些总结
- 【数据结构与算法】 利用哈夫曼树进行文件压缩 (部分借鉴网上内容)
- 集合框架_集合的特点和数据结构、如何选择使用哪种集合呢、各种集合常见功能和遍历方式总结
- 数据结构之重写ArrayList的底层源码