使用KMP算法实现串匹配你在课堂上想必已经烂熟于心了,不过咱们先来聊一聊圆周率π。有的人猜想,无理数π的小数部分包含了宇宙中的大秘密,比如你的生日、你男朋友/女朋友的生日,甚至是你的银行卡的账号密码。将它穷尽是一件不可能的事情,但是我们可以对前面的部分进行考察。 在这个题目中,不允许使用编程语言内置的字符串匹配算法,例如C语言中的strcmp。
如果你想查找自己的π信息,可以登录网站The Pi-Search Page
输入格式:
输入为两行,第一行为圆周率小数部分的节选s,长度不超过106;第二行是要查找的数字串t,长度不超过106。可以假设,输入都是0~9这样的数字。
输出格式:
输出t在s中首次出现的位置。如果t未在s中出现,则输出-1,以换行结尾。
输入样例1:
821999052039574422
19990520
结尾无空行
输出样例1:
2
结尾无空行
输入样例2:
881994082555083527588321827035
19940825
结尾无空行
输出样例2:
2
结尾无空行
输入样例3:
141592653
264
结尾无空行
输出样例3:
-1
结尾无空行
代码:
# include <iostream>
# include <vector>
using namespace std;
vector<int> get_next(string b)
{
vector<int> result;
int i, j ,l;
i = 0;
j = -1;
l = b.size();
result.push_back(-1);
while (i < l - 1)
{
if (j == -1 || b[i] == b[j])
{
++i;
++j;
if (b[i] != b[j])
result.push_back(j);
else if (i == 1)
result.push_back(j);
else
result.push_back(result[j]);
}
else
j = result[j];
}
return result;
}
int KMP(string a, string b)
{
vector<int> next;
next = get_next(b);
int i ,j,l1,l2;
i = j = 0;
l1 = a.size();
l2 = b.size();
while (i < l1 && j < l2)
{
if (j == -1 || a[i] == b[j])
{
++i;
++j;
}
else
{
j = next[j];
}
}
if (j == l2)
{
return i - j;
}
else
{
return -1;
}
}
int main()
{
string s,p;
int t;
cin >> s >> p;
t = KMP(s, p);
cout << t << endl;
}