题解 | #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;
}
全部评论

相关推荐

05-30 12:03
山西大学 C++
offer来了我跪着...:不是骗子,等到测评那一步就知道为啥这么高工资了
点赞 评论 收藏
分享
程序员牛肉:主要是因为小厂的资金本来就很吃紧,所以更喜欢有实习经历的同学。来了就能上手。 而大厂因为钱多,实习生一天三四百的就不算事。所以愿意培养你,在面试的时候也就不在乎你有没有实习(除非是同级别大厂的实习。) 按照你的简历来看,同质化太严重了。项目也很烂大街。 要么换项目,要么考研。 你现在选择工作的话,前景不是很好了。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务