关注
/*若主串长度为N,子串长度为M,暴力求解时间复杂度为O(M x N)。
KMP 算法时间复杂度O(M)+O(N)。算法最主要的就是子串的next数组的构造了。
首先生成子串的next_arr数组,这个数组长度与子串长度一致。数组中第i个
元素next_arr[i]的含义是B[i]之前的字符串B[0...i-1]中,必须以B[i-1]结尾
的后缀子串(不能包含B[0])与必须以B[0]开头的前缀子串(不能包含B[i-1])
最大匹配长度是多少,这个长度就是next_arr[i]的值。子串用处:当到第i个
元素与主串不匹配的时候,可以不一定要从子串头和主串初始匹配时的下一个
元素做起点开始匹配。因为next_arr数组记录了子串第i个元素之前的子串特性。
若子串在B[i]处于主串A[j]处不匹配,则j位置不变,下次从B[next_arr[i]]处
继续和A[j]相比。*/
#include<iostream>
#include<string>
using namespace std;
//求子串next数组
int* getnext_arr(string B)
{
int len = B.length();
int* next = new int[len];
next[0] = -1;
if(len==1)
return next;
next[1] = 0;
int pos = 2;
int cn = 0;
while(pos < len)
{
if(B[pos-1] == B[cn])
next[pos++] = ++cn;
else if(cn > 0)
cn = next[cn];
else
next[pos++] = 0;
}
return next;
}
//匹配,若能匹配,返回主串匹配起始的下标,若不能则返回-1
int getIndex(string A, string B)
{
if(A == "" || B == "" || B.length() < 1 || A.length() < B.length())
return -1;
int Ai = 0, Bi=0;
int *next = new int[B.length()];
next = getnext_arr(B);
while(Ai < A.length() && Bi < B.length())
{
if(A[Ai] == B[Bi])
{
Ai++; Bi++;
}
else if(next[Bi] == -1)
{
Ai++;
}
else
{
Bi = next[Bi];
}
}
return Bi == B.length() ? Ai - Bi : -1;
}
int main()
{
string A,B;
while(cin>> A >> B)
{
cout<<getIndex(A,B) <<endl;
}
return 0;
}
查看原帖
点赞 1
相关推荐
查看23道真题和解析 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 这个offer值得去吗? #
16281次浏览 163人参与
# 26届秋招投递记录 #
124539次浏览 688人参与
# 联宝杯大学生创新大赛,你的技术值得产业级答案 #
46777次浏览 510人参与
# 如果春招能重来,我会___ #
17386次浏览 195人参与
# 你觉得实习能学到东西吗 #
153651次浏览 1489人参与
# 除了线上,还能去哪些地方投简历 #
9860次浏览 109人参与
# 大家每天通勤多久? #
119403次浏览 1653人参与
# 为了实习逃课值吗? #
81948次浏览 580人参与
# 想做Agent可以做哪些岗位? #
14488次浏览 438人参与
# 面试官拷打AI项目都会问什么? #
14946次浏览 479人参与
# 互联网公司评价 #
536131次浏览 4187人参与
# 九月了,是考研还是就业? #
110057次浏览 610人参与
# 金三银四,你的春招进行到哪个阶段了? #
36259次浏览 336人参与
# 转正答辩报告怎么写 #
61296次浏览 810人参与
# 你觉得最好用的AI编程工具是_ #
5459次浏览 99人参与
# 一份好的简历长什么样? #
41615次浏览 505人参与
# 浅聊一下我实习的辛苦费 #
291680次浏览 1801人参与
# 实习,不懂就问 #
215033次浏览 1711人参与
# 你找工作的时候用AI吗? #
209094次浏览 1021人参与
# 通信硬件薪资爆料 #
1318900次浏览 7290人参与
# 影石Insta360求职进展汇总 #
189944次浏览 1383人参与
