题目描述
纯纯字符串模拟,但是细节有点多,题目描述的也不够清楚
通过两次debug才找到错
两次错误也在代码里面注释了,如果存在相同的问题可以关注一下
样例
见题面
C++ 代码
#include<bits/stdc++.h>
using namespace std;
vector<string> URL[105];
vector<string> args_lst;//记录匹配结果的参数列表
map<string,int> URL_type;//记录输入串的各项type信息
map<int,string> URL_name;//记录输入的URL的name信息
void process(int num,string s){
int pos=0;string name="";
while(pos<s.length()){
if(s[pos]=='/'){
URL[num].push_back(name);
URL[num].push_back("/");// ‘/’也能用来做区分是真的抽象
//第一次错在这个地方,题目说的不明不白,没想到/也可以作为区分
name="";
}else{
name+=s[pos];
}
pos++;
}
if(name!="") URL[num].push_back(name);//可能是path变量
}
int check_type(string s){
for(int i=0;i<s.length();i++){
if(s[i]<'0'||s[i]>'9') return 1;//字符串
}
return 2;//数字
}
bool check(int num){
int i,num_pos,type,pos=0;//pos检查最后是否所项完全匹配
string path="";args_lst.clear();
for(i=0;i<URL[num].size()&&pos<URL[0].size();i++){//逐个对比
type=check_type(URL[0][i]);
if(URL[num][i]=="<str>"){
if(type!=1&&type!=2) return false;
else{
args_lst.push_back(URL[0][pos]);
pos++;
}
}else if(URL[num][i]=="<int>"){
if(type!=2) return false;
else{
num_pos=0;
while(URL[0][pos][num_pos]=='0'&&num_pos<URL[0][pos].length()) num_pos++;
if(num_pos==URL[0][pos].length()) args_lst.push_back("0");//当前参数为0
else args_lst.push_back(URL[0][pos].substr(num_pos,URL[0][pos].length()-num_pos));//删除前导0
//第二次的问题出在这个地方,如果前导0全部删了,则参数为0会在参数列表中加入一个空串
pos++;
}
}else if(URL[num][i]=="<path>"){
while(pos<URL[0].size()){
path+=URL[0][pos];pos++;
}
args_lst.push_back(path);
}else{
if(URL[num][i]!=URL[0][i]) return false;
else pos++;
}
}
if(pos!=URL[0].size()||i!=URL[num].size()) return false;//有一个没有匹配完全
return true;
}
int main(){
int n,m;bool flag;
string str,name;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>str>>name;
URL_name[i]=name;
process(i,str);
}
while(m--){
URL[0].clear();flag=false;
cin>>str;process(0,str);//将需要匹配的数据存到URL[0]中
for(int i=1;i<=n;i++){
if(check(i)){
cout<<URL_name[i]<<" ";
for(int j=0;j<args_lst.size();j++) cout<<args_lst[j]<<" ";
cout<<endl;
flag=true;break;
}
}
if(!flag) cout<<"404"<<endl;
}
return 0;
}