i 的情况,要判断前导为0时,要过滤掉,所以用到了ok标记,初始值为false,若前导有0,则它的值一直为false不会进行输出,遇到非零时,不管后面有没有0它的值都为true会进行输出,最后判断一下ok是不是还是初始值,是的话说明他后面不是字符串,或者后面都是0则不进行继续,直接返回false;然后j 指针加一下int>的长度移到下一个<的位置;
s 的情况,类似,str的退出条件是遇到 / ,没有遇到就可以一直去走,str可不仅仅只能放字母,数字也是可以的,当然还得用ok标记是否匹配,不是的话直接返回false;然后j += 4;
p 的情况,由于path最后就是结束,所以推出条件就是ss[i] 为空的时候,走到这一步就可以直接返回true了;
最后的判断 i 和 j 指针是否走到了终点,若终点都没走到则返回false;否则返回true;
参考代码: 细 节 + 模 拟 + 字 符 串 + 标 记 + 耐 心
#include<cstdio>#include<string>#include<cstring>#include<iostream>#include<algorithm>usingnamespace std;int N, M;
string str[110], s, r[110];//flag 标记本次是否可以匹配boolmatch(string ss, string tt,bool flag){int ls = ss.size(), lt = tt.size();int i =0, j =0;while(i < ls && j < lt){if(ss[i]== tt[j]) i++, j++;else{if(tt[j++]!='<')returnfalse;//若本次可以配对,则可以输出if(flag) cout <<" ";//解决<int>if(tt[j]=='i'){//解决前导有0的情况bool ok =false;while(true){if(ss[i]>='0'&& ss[i]<='9'){//若前导有0 则ok为false; 后面若有非零 则ok 永远为trueif(s[i]!='0') ok =true;//这里不会输出; 这里会过滤前导为0的数if(flag && ok) cout << ss[i];
i++;}else{if(ss[i]=='/')break;elsereturnfalse;}}if(!ok)returnfalse;//都指向'/'
j +=4;}//解决<str>elseif(tt[j]=='s'){//ok标记是不是匹配的字符串bool ok =false;while(ss[i]&& ss[i]!='/'){
ok =true;if(flag) cout << ss[i];
i++;}//若无法匹配直接返回falseif(!ok)returnfalse;
j +=4;}//解决<path>elseif(tt[j]=='p'){while(ss[i]){if(flag) cout << ss[i];
i++;}returntrue;}}}//最终判断循环变量是否走到了终点return ls == i && lt == j;}intmain(){
cin >> N >> M;for(int i =0; i < N; i++) cin >> str[i]>> r[i];for(int i =0; i < M; i++){
cin >> s;//flag标记是否可以匹配bool flag =false;for(int j =0; j < N; j++){//先判断能否匹配,能匹配就进行匹配输出if(match(s, str[j],false)){
flag =true;
cout << r[j];match(s, str[j],true);break;}}if(!flag) cout <<"404";
cout << endl;}return0;}