题解 | #String Matching#

String Matching

http://www.nowcoder.com/practice/00438b0bc9384ceeb65613346b42e88a

#include <cstdio>
#include <iostream>
#include <string>

using namespace std;

void get_next(const string &t, int *next){
	int i=1, j=0;
	next[1] = 0;
	while(i<=t.size()){
		if(j==0 || t[i] == t[j]){
			i++;j++;
			next[i] = j;
		}else{
			j = next[j];
		}
	}
	return;
}

int KMP_47(const string &s, const string &t, int pos){
	int i = pos;
	int j = 1;
	int next[t.size()];
	get_next(t, next);
	int num = 0;
//	while(i<s.size()&&j<=t.size()) s下标从0开始,t下标从1开始 这是原KMP算法,返回的是第一个匹配到的字串的首位位置
	while(i < s.size()){
		if(j==0 || s[i] == t[j-1]){//t实际下标从0开始 
			i++;j++;
		}else{
			j=next[j];
		}
		if(j-1 == t.size()){//检查“匹配成功”  成功则计数,并“假设为失败”来高效地往后跳 
			num++;
			j = next[j-1];
			i--;
		}
	}
	return num; 
}

int main(){
	string s,t;
	while(cin >> s >> t){
		printf("%d\n",KMP_47(s,t,0));
		s.clear();
		t.clear();
	}
	return 0;
}
全部评论

相关推荐

牛客101244697号:这个衣服和发型不去投偶像练习生?
点赞 评论 收藏
分享
10-24 11:10
山西大学 Java
若梦难了:哥们,面试挂是很正常的。我大中厂终面挂,加起来快10次了,继续努力吧。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-27 10:52
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务