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;
}

发布了197 篇原创文章 · 获赞 18 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_41708792/article/details/103317909