CCP-CSP認證考試 201803-3 URL映射 c/c++題解

題目描述

題解:

這道題我只拿到了50分,還有50分是沒有考慮的情況:
我的思路

  1. 輸入(其實這種大型的模擬題將輸入完成了,就完成了三分之一了,其餘的三分之二就是寫出整體的邏輯+調試了):
    rule 規則我用一個一維數組保存,每個元素是一個結構體,其中包含了url規則串、url規則名稱,規則串我是用數組保存每個以’‘分隔的字符串。
    rule 匹配串我直接用一個二維的字符串數組保存,每一行保存一個rule匹配串的每個以’'分隔的字符串。
  2. 模擬匹配的過程:其實沒什麼別的技巧,就是將每個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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章