数据结构实验之串一:KMP简单应用

来源:互联网 发布:英国域名后缀 编辑:程序博客网 时间:2024/06/06 18:26

数据结构实验之串一:KMP简单应用

Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic

Problem Description

给定两个字符串string1和string2,判断string2是否为string1的子串。

Input

 输入包含多组数据,每组测试数据包含两行,第一行代表string1(长度小于1000000),第二行代表string2(长度小于1000000),string1和string2中保证不出现空格。

Output

 对于每组输入数据,若string2是string1的子串,则输出string2在string1中的位置,若不是,输出-1。

Example Input

abca12345645abcddd

Example Output

14-1

Hint

 

Author

cjx

#include<bits/stdc++.h>using namespace std;//注意数组从0开始//char str1[1000001], str2[1000001];int next[1000001];void get_next(){int i = 0; //i是next数组下标next[0] = -1;int j = -1; //j是模板字符串前后缀长度while (str2[i] != '\0') //从第二个字符开始,计算next数组对应的值{if (j == -1 || str2[i] == str2[j]) //如果相等,下标后移,前后缀长度加1{i++;j++;next[i] = j;//printf("%d ",next[i]);}else{j = next[j];    //失配时j的值}}}void kmp(){int i = 0, j = 0;get_next();int len1 = strlen(str1);int len2 = strlen(str2);while (i < len1 && j < len2){if (j == -1 || str1[i] == str2[j]){i++;j++;}else{j = next[j]; //失配时str2回溯的位置}}if (j >= len2){printf("%d\n", i - len2 + 1);    //输出第一次匹配时的位置}else{printf("%d\n", -1);}}int main(){while (cin >> str1 >> str2){kmp();}return 0;}/*int main(){string b;while (cin >> b){getnext(b);for (int i = 1; i <= 8; i++){printf("%d ", next[i]);}}return 0;}*/


0 0