url映射 ccf (Java正则表达式80分解法)
生活随笔
收集整理的這篇文章主要介紹了
url映射 ccf (Java正则表达式80分解法)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題描述
| 試題編號: | 201803-3 |
| 試題名稱: | URL映射 |
| 時間限制: | 1.0s |
| 內存限制: | 256.0MB |
| 問題描述: | 問題描述 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也去掉了,80分。。。
1 import java.util.LinkedHashMap; 2 import java.util.Map; 3 import java.util.Scanner; 4 import java.util.regex.Matcher; 5 import java.util.regex.Pattern; 6 7 8 public class Main { 9 10 public static void main(String[] args) { 11 int n, m; 12 int flag = 0; 13 Scanner sc = new Scanner(System.in); 14 n = sc.nextInt(); 15 m = sc.nextInt(); 16 sc.nextLine(); 17 LinkedHashMap<String, String> mp = new LinkedHashMap<>(); 18 for (int i = 1; i <= n; ++i) { 19 String line = sc.nextLine(); 20 String[] arr = line.split(" "); 21 mp.put(arr[0], arr[1]); 22 } 23 24 for (int i = 1; i <= m; ++i) { 25 String line = sc.nextLine(); 26 for (Map.Entry<String, String> en : mp.entrySet()) { 27 String regex = en.getKey(); 28 regex = regex.replace("<int>", "(\\d+)"); 29 regex = regex.replace("<str>", "(.+)"); 30 regex = regex.replace("<path>", "(.+)"); 31 if(line.matches(regex)) { // 完全匹配 32 flag = 1; 33 Pattern p = Pattern.compile(regex); 34 Matcher mat = p.matcher(line); 35 while (mat.find()) { 36 System.out.print(en.getValue()); 37 for (int j = 1; j <= mat.groupCount(); ++j) { 38 String str = mat.group(j); 39 // if(str.matches("\\d+")) 40 str = str.replaceAll("^0+", ""); // 去掉數字前面的0 (字符串前面的0也去掉了) 41 System.out.print(" " + str); 42 } 43 System.out.println(); 44 } 45 break; 46 } 47 } 48 if(flag == 0) 49 System.out.println(404); 50 else 51 flag = 0; // 重置flag 52 } 53 54 } 55 56 }?
轉載于:https://www.cnblogs.com/FengZeng666/p/11484278.html
總結
以上是生活随笔為你收集整理的url映射 ccf (Java正则表达式80分解法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 碰撞的小球 ccf (模拟)
- 下一篇: 二分求幂 模板