概述
题目描述
题解:
这道题我只拿到了50分,还有50分是没有考虑
的情况:
我的思路:
- 输入(其实这种大型的模拟题将输入完成了,就完成了三分之一了,其余的三分之二就是写出整体的逻辑+调试了):
rule 规则我用一个一维数组保存,每个元素是一个结构体,其中包含了url规则串、url规则名称,规则串我是用数组保存每个以’‘分隔的字符串。
rule 匹配串我直接用一个二维的字符串数组保存,每一行保存一个rule匹配串的每个以’'分隔的字符串。- 模拟匹配的过程:其实没什么别的技巧,就是将每个url匹配串去匹配url规则,开几个循环就好了,具体看代码。
但是有个需要处理的点:就是 (我暂时没有考虑),我是用的两个函数去判断。
还有一个需要注意的点:就是如果参数是整数,那么要去掉前导0(涉及到10分的测点)
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <deque>
#include <list>
#include <utility>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <bitset>
#include <iterator>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double PI = acos(-1.0);
const double E = exp(1.0);
const int MOD = 1e9+7;
const int MAX = 1e5+5;
int n,m;// n-表示URL映射的规则条数 m-待处理的URL地址个数
typedef struct Node
{
vector <string> ruleContent;
string ruleName;
} Node;
vector <Node> rule(100+5);
vector <string> url[100+5];
bool IsString(string str)// 判断传入的str是否满足<str>的条件
{
for(int i = 0; i < (int)str.length(); i++)
{
if(isalnum(str[i]) || str[i] == '-' || str[i] == '_' || str[i] == '.')
{
// 字符串只能有这些内容:大小写字母、数字、'-'、'_'、'.'
}
else
{
return false;
}
}
return true;
}
bool IsInt(string str)// 判断传入的str是否满足<int>的条件
{
for(int i = 0; i < (int)str.length(); i++)
{
if(!isdigit(str[i]))
{
return false;
}
}
return true;
}
bool IsPath(string str)// 判断传入的str是否满足<path>的条件
{
}
int main()
{
/*
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
*/
cin >> n >> m;
cin.get();
for(int i = 0; i < n; i++)
{
string str;
getline(cin,str);
char *str1 = (char*)str.c_str();
char *result = NULL;
result = strtok(str1," ");
string tmp1 = result; // 分出来的第一个字符串为规则的内容
//cout << tmp1 << endl;
result = strtok(NULL," ");
string tmp2 = result;// 分出来的第二个字符串为规则的名称
//cout << tmp2 << endl;
rule[i].ruleName = tmp2;// 规则的名字
string StrContent = tmp1;// 规则的内容(将以""分隔的字符串分隔出来)
char *str2 = (char*)StrContent.c_str();
result = NULL;
result = strtok(str2,"/");
while(result != NULL)
{
string tmp = result;
//cout << tmp << endl;
rule[i].ruleContent.push_back(tmp);
result = strtok(NULL,"/");
}
}
for(int i = 0; i < m; i++)
{
string str;
cin >> str;
char *str2 = (char*)str.c_str();
char *result = NULL;
result = strtok(str2,"/");
while(result != NULL)
{
string tmp = result;
url[i].push_back(tmp);
result = strtok(NULL,"/");
}
}
/*
for(int i = 0; i < n; i++)
{
cout << rule[i].ruleName << " ";
for(int j = 0; j < (int)rule[i].ruleContent.size(); j++)
{
cout << rule[i].ruleContent[j] << " ";
}
cout << endl;
}
for(int i = 0; i < m; i++)
{
for(int j = 0; j < (int)url[i].size(); j++)
{
cout << url[i][j] << " ";
}
cout << endl;
}*/
for(int i = 0; i < m; i++)// url匹配串
{
bool flag = false;// 判断这个url有无匹配的url规则
// 要能保证 url[i].size() 中的每个字符串都能匹配 url规则的某一行
for(int r = 0; r < n; r++)// 所有的url规则
{
// 规则内容:rule[i].ruleContent (一个字符串数组)
// 规则名称:rule[i].ruleName (一个字符串)
bool flag1 = true;// 判断这个url规则能否匹配url[i]
vector <string> res;
res.push_back(rule[r].ruleName);
if(url[i].size() != rule[r].ruleContent.size())
{
flag1 = false;
}
else
{
for(int j = 0; j < (int)url[i].size(); j++)
{
if(url[i][j] == rule[r].ruleContent[j])
{
// 如果两个字符串相等,直接contniue即可
continue;
}
else
{
// 如果两个字符串不相等,则要判断
// 如果rule[i].ruleContent[j]是<int>,那么url[i][j]就要是int
// 如果rule[i].ruleContent[j]是<str>。那么url[i][j]就要是string
// 暂时不考虑<path>的情况
if(rule[r].ruleContent[j] == "<int>" && IsInt(url[i][j]))
{
// 如果是整数参数,要去掉前导零
string tmp = url[i][j];
int index = 0;
while(tmp[index] == '0') index++;
res.push_back(tmp.substr(index));
continue;
}
else if(rule[r].ruleContent[j] == "<str>" && IsString(url[i][j]))
{
res.push_back(url[i][j]);
continue;
}
else
{
flag1 = false;
break;
}
}
}
if(flag1)
{
for(int k = 0; k < (int)res.size(); k++)
{
cout << res[k] << " ";
}
cout << endl;
flag = true;
break;
}
}
}
if(!flag)
{
cout << "404" << endl;
}
}
return 0;
}
最后
以上就是魁梧电话为你收集整理的CCP-CSP认证考试 201803-3 URL映射 c/c++题解的全部内容,希望文章能够帮你解决CCP-CSP认证考试 201803-3 URL映射 c/c++题解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复