码迷,mamicode.com
首页 > Web开发 > 详细

201803-3 URL映射

时间:2019-09-12 13:01:06      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:失败   规则   下划线   先后   必须   文字   style   表示   back   

问题描述
  URL 映射是诸如 Django、Ruby on Rails 等网页框架 (web frameworks) 的一个重要组件。对于从浏览器发来的 HTTP 请求,URL 映射模块会解析请求中的 URL 地址,并将其分派给相应的处理代码。现在,请你来实现一个简单的 URL 映射功能。
  本题中 URL 映射功能的配置由若干条 URL 映射规则组成。当一个请求到达时,URL 映射功能会将请求中的 URL 地址按照配置的先后顺序逐一与这些规则进行匹配。当遇到第一条完全匹配的规则时,匹配成功,得到匹配的规则以及匹配的参数。若不能匹配任何一条规则,则匹配失败。
  本题输入的 URL 地址是以斜杠 / 作为分隔符的路径,保证以斜杠开头。其他合法字符还包括大小写英文字母、阿拉伯数字、减号 -、下划线 _ 和小数点 .。例如,/person/123/ 是一个合法的 URL 地址,而 /person/123? 则不合法(存在不合法的字符问号 ?)。另外,英文字母区分大小写,因此 /case/ 和 /CAse/ 是不同的 URL 地址。
  对于 URL 映射规则,同样是以斜杠开始。除了可以是正常的 URL 地址外,还可以包含参数,有以下 3 种:
  字符串 <str>:用于匹配一段字符串,注意字符串里不能包含斜杠。例如,abcde0123。
  整数 <int>:用于匹配一个不带符号的整数,全部由阿拉伯数字组成。例如,01234。
  路径 <path>:用于匹配一段字符串,字符串可以包含斜杠。例如,abcd/0123/。
  以上 3 种参数都必须匹配非空的字符串。简便起见,题目规定规则中 <str> 和 <int> 前面一定是斜杠,后面要么是斜杠,要么是规则的结束(也就是该参数是规则的最后一部分)。而 <path> 的前面一定是斜杠,后面一定是规则的结束。无论是 URL 地址还是规则,都不会出现连续的斜杠。
输入格式
  输入第一行是两个正整数 n 和 m,分别表示 URL 映射的规则条数和待处理的 URL 地址个数,中间用一个空格字符分隔。
  第 2 行至第 n+1 行按匹配的先后顺序描述 URL 映射规则的配置信息。第 i+1 行包含两个字符串 pi 和 ri,其中 pi 表示 URL 匹配的规则,ri 表示这条 URL 匹配的名字。两个字符串都非空,且不包含空格字符,两者中间用一个空格字符分隔。
  第 n+2 行至第 n+m+1 行描述待处理的 URL 地址。第 n+1+i 行包含一个字符串 qi,表示待处理的 URL 地址,字符串中不包含空格字符。
输出格式
  输入共 m 行,第 i 行表示 qi 的匹配结果。如果匹配成功,设匹配了规则 pj ,则输出对应的 rj。同时,如果规则中有参数,则在同一行内依次输出匹配后的参数。注意整数参数输出时要把前导零去掉。相邻两项之间用一个空格字符分隔。如果匹配失败,则输出 404。
样例输入
5 4
/articles/2003/ special_case_2003
/articles/<int>/ year_archive
/articles/<int>/<int>/ month_archive
/articles/<int>/<int>/<str>/ article_detail
/static/<path> static_serve
/articles/2004/
/articles/1985/09/aloha/
/articles/hello/
/static/js/jquery.js
样例输出
year_archive 2004
article_detail 1985 9 aloha
404
static_serve js/jquery.js
样例说明
  对于第 1 个地址 /articles/2004/,无法匹配第 1 条规则,可以匹配第 2 条规则,参数为 2004。
  对于第 2 个地址 /articles/1985/09/aloha/,只能匹配第 4 条规则,参数依次为 1985、9(已经去掉前导零)和 aloha。
  对于第 3 个地址 /articles/hello/,无法匹配任何一条规则。
  对于第 4 个地址 /static/js/jquery.js,可以匹配最后一条规则,参数为 js/jquery.js。
数据规模和约定
  1 ≤ n ≤ 100,1 ≤ m ≤ 100。
  所有输入行的长度不超过 100 个字符(不包含换行符)。
  保证输入的规则都是合法的。
 
 
 
这题要注意前导0 和最后一个斜杠也要考虑。
 
  1 #include <bits/stdc++.h>
  2 
  3 using namespace std;
  4 const int N = 100 + 5;
  5 
  6 int n, m;
  7 vector<string> reg[N];
  8 vector<string> reg_name;
  9 
 10 void format_reg(int c, string & line)
 11 {
 12     stringstream ss(line);
 13     string name;
 14     ss >> line >> name;
 15     reg_name.push_back(name);
 16 
 17     for(int i = 0; i < (int)line.length(); i++) {
 18         if(line[i] == /) {
 19             reg[c].push_back("/");
 20         }else {
 21             if(reg[c].back() == "/") {
 22                 reg[c].push_back(string(&line[i], &line[i] + 1));
 23             }else {
 24                 string & tmp = reg[c].back();
 25                 tmp += string(&line[i], &line[i] + 1);
 26             }
 27         }
 28     }
 29 }
 30 
 31 void url_split(string &url, vector<string> &urls)
 32 {
 33      for(int i = 0; i < url.length(); i++) {
 34         if(url[i] == /) {
 35             urls.push_back("/");
 36         }else {
 37             if(urls.back() == "/") {
 38                 urls.push_back(string(&url[i], &url[i] + 1));
 39             }else {
 40                 string & tmp = urls.back();
 41                 tmp += string(&url[i], &url[i] + 1);
 42             }
 43         }
 44      }
 45 }
 46 bool is_int(string & s)
 47 {
 48     for(int i = s.length() - 1; i >= 0; i--) {
 49         if(!isdigit(s[i])) return false;
 50     }
 51     return true;
 52 }
 53 
 54 bool is_equal(string & regn, vector<string> & urls, vector<string> & param)
 55 {
 56 
 57     if(urls.size() == 0) return false;
 58     if(regn == urls.front()) {
 59         urls.erase(urls.begin());
 60         return true;
 61     }else if(regn == "<path>") {
 62         string tmp = "";
 63         for(int j = 0; j < (int)urls.size(); j++) {
 64             tmp += urls[j];
 65         }
 66         param.push_back(tmp);
 67         urls.clear();
 68         return true;
 69     }else if(regn == "<int>") {
 70         if(is_int(urls.front())) {
 71             param.push_back(urls.front());
 72             urls.erase(urls.begin());
 73             return true;
 74         }
 75         return false;
 76     }else if(regn == "<str>") {
 77         param.push_back(urls.front());
 78         urls.erase(urls.begin());
 79         return true;
 80     }
 81     return false;
 82 }
 83 
 84 bool match(const int &c, string url, vector<string> & param)
 85 {
 86     vector<string> urls;
 87     stringstream ss(url);
 88     url_split(url, urls);
 89 
 90     for(size_t i = 0; i < reg[c].size(); i++) {
 91         if(!is_equal(reg[c][i], urls, param)) return false;
 92         if(urls.size() == 0 && i == reg[c].size() - 1) return true;
 93     }
 94 
 95     return false;
 96 }
 97 
 98 void print_reg()
 99 {
100     for(int i = 0; i < n; i++) {
101         for(auto & tmp : reg[i]) cout << tmp << " ";
102         cout << endl;
103     }
104 }
105 
106 int get_result(string & url, vector<string> & param)
107 {
108 
109     for(int i = 0; i < n; i++) {
110         param.clear();
111         //cout << "---------------------------" << endl;
112         if(match(i, url, param)) return i;
113     }
114     return -1;
115 }
116 
117 int main()
118 {
119     cin >> n >> m;
120     cin.ignore();
121     string line;
122     for(int i = 0; i < n; i++) {
123         getline(cin, line);
124         format_reg(i, line);
125     }
126     //print_reg();
127 
128     vector<string> param;
129     for(int i = 0; i < m; i++) {
130         getline(cin, line);
131         int ans = get_result(line, param);
132         if(ans == -1) {
133             cout << 404 << endl;
134         }else {
135             cout << reg_name[ans]<< " ";
136             for(int i = 0; i < (int)param.size(); i++) {
137                 if(is_int(param[i])) {
138                     int ans = atoi(param[i].c_str());
139                     cout << ans << " ";
140                 }else
141                     cout << param[i] << " ";
142             }
143             cout << endl;
144         }
145     }
146 }

 

201803-3 URL映射

标签:失败   规则   下划线   先后   必须   文字   style   表示   back   

原文地址:https://www.cnblogs.com/Pretty9/p/11511075.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!