题解 |

字符串匹配

http://www.nowcoder.com/practice/fbdc522ef958455687654b38a4ca01e0

#include <iostream>
#include <string>
#include <cstring>
#include <vector>

using namespace std;

//思路重新整理:从输入数据出发,逐行尽最大努力去让自己被匹配 

bool cmp(char ch1, char ch2){
	if(ch1>='a' && ch2<='z'){
		ch1 -= 32;
	}
	if(ch2>='a' && ch2<='z'){
		ch2 -= 32;
	}
	if(ch1 == ch2){
		return true;
	}else{
		return false;
	}
}

bool pipei(const string &s1, const string &s2){//s2中含有若干[] 
	int spe = 0;//标记“中括号内”特殊态 
	int p=0, q=0;
	while(p < s1.size()){
		if(!spe && !cmp(s1[p],s2[q]) && s2[q] != '[' && s2[q] != ']'){
			return false;
		}else if(!spe && cmp(s1[p],s2[q])){
			p++;q++;
		}else if(s2[q] == '['){
			q++;
			spe = 1;
		}else if(s2[q] == ']'){
			q++;
			spe = 0;
		}else if(spe && !cmp(s1[p],s2[q])){
			if(s2[q+1] != ']'){
				q++;
			}else{
				return false;
			}
		}else if(spe && cmp(s1[p],s2[q])){//括号内剩下的没有再比的必要了 
			while(s2[q] != ']'){
				q++;
			}
			p++;
		}
	}
	return true;
}

void ZFCPP(void){
	int n;
	vector<string> v;
	while(scanf("%d",&n)!=EOF){
		string s;
		while(n--){
			cin >> s;
			v.push_back(s);
		}
		cin >> s;
		for(int i=0; i<v.size(); i++){
			if(pipei(v[i],s)){
				printf("%d %s\n",i+1,v[i].c_str());
			}
		}
		v.clear();
	}
	return;
}

int main(){
	ZFCPP();
	return 0;
}
全部评论

相关推荐

10-07 20:48
门头沟学院 Java
听说改名就会有offer:可能是实习上着班想到后面还要回学校给导师做牛马,看着身边都是21-25的年纪,突然emo了了
点赞 评论 收藏
分享
拒绝无效加班的小师弟很中意你:求职意向没有,年龄、课程冗余信息可以删掉,需要提升项目经历。排版需要修改。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务