编码问题(递归方法)

解题思路:

// 解题思路:1,初始化,字符编码与字符的关系。2,采用分支的方法循环判断所有编码情况下的结果,保存每一条记录统计有多少结果。

#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <map>
using namespace std;

class Solution{
    public :
    //target原数组, vecmp映射表,result保存所有结果,keep记录当前字符串,n当前字符的位置,m为原字符串长度, count统计有多少条
    void dealString(string target, vector<unordered_map<string, char>> vecmp, vector<string> &result, string keep, int n,  int m, int &count){
        if(n == m){
            result.push_back(keep);
            count++;
            return;
        }
        if(n > m){
            return;
        }
        for(int i = 0; i < vecmp.size(); i++){
            int k = i+1;
            string zz = target.substr(n,k);
            if(vecmp[i][zz]){
                keep.push_back(vecmp[i][zz]);
                dealString(target, vecmp, result, keep, n+k,  m, count); 
                keep.pop_back();
            }
        }
        
    }
};

int main(){
    vector<unordered_map<string, char>> vecmp;
    unordered_map<string, char> mp1= {{"1",'A'}};
    unordered_map<string, char> mp2= {{"10",'B'}, {"11",'C'}};
    unordered_map<string, char> mp3= {{"100",'D'}, {"101",'E'}, {"110",'F'},{"111",'G'}};
    unordered_map<string, char> mp4= {{"1000",'H'}, {"1001",'I'}, {"1010",'J'}, {"1011",'K'}, {"1100",'L'}, {"1101",'M'},{"1110",'N'}, {"1111",'O'},};
    unordered_map<string, char> mp5= {{"10000",'P'}, {"10001",'Q'}, {"10010",'R'}, {"10011",'S'}, {"10100",'T'}, {"10101",'U'}, {"10110",'V'}, {"10111",'W'}, {"11000",'X'},{"11001",'Y'},{"11010",'Z'}};
    vecmp.push_back(mp1);
    vecmp.push_back(mp2);
    vecmp.push_back(mp3);
    vecmp.push_back(mp4);
    vecmp.push_back(mp5);
    
    string start ="1";

    Solution slove;
    vector<string> result;
    string keep;
    int count = 0;
    // void dealString(string target, vector<unordered_map<string, char>> vecmp, vector<string> &result, string keep, int n,  int m, int &count)
    slove.dealString(start, vecmp,result, keep, 0, start.size(),count);
    cout<<count<<endl;
    for(int i = 0; i< result.size(); i++){
        cout<<result[i]<<endl;
    }


    system("pause");
    return 0;
}

题2

#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <map>
#include<string.h>
using namespace std;

class Solution1{
    public :
    string getMaskPre(string source, int num){
        string pre;
        string temp;
        char changestr[40];
        char* delim=".";                        //分隔符字符串
        strncpy(changestr,source.c_str(), 39);
        char* p=strtok(changestr, delim);   //第一次调用strtok
        while(p!=NULL){                         //当返回值不为NULL时,继续循环
            string mystr = p;               
            if(num >= 8){
                pre = pre + mystr+'.';
                num = num - 8;
                // temp = "";
            }else if(num > 0){
                int aa = stoi(mystr);                // string 10 转为 int 10  
                num = 8 -  num;                     // 26-8*3 = 2  需左移 8 -2= 6位           
                int leftresult = aa>>num;
                pre = pre + to_string(leftresult);
                break;
            }
            else{
                break;
            }
            p=strtok(NULL,delim);//继续调用strtok,分解剩下的字符串
        }
        return pre;
    }

    pair<string, int> remergeMask(string target){ //掩码前缀,掩码长度
        pair<string, int> keep;
        int index = target.find("/");
        string ip = target.substr(0,index);
        string num = target.substr(index+1);
        int count = stoi(num);
        keep.first = getMaskPre(ip, count);
        keep.second = count;
        return keep;
    }

    //检查黑名单
    vector<string> maskCheckBack(vector<string> mask, vector<string> check){
        vector<string> result;
        unordered_map<string, int> strmp;
        map<int, int> num_mp;
        map<int, int>::iterator it;
        for(int i = 0; i < mask.size(); i++){ // 记录要查找的掩码长度和掩码前缀
            pair<string, int> changeStr = remergeMask(mask[i]);
            strmp[changeStr.first] = 1;       // 保存掩码前缀
            it = num_mp.find(changeStr.second); // 保存数字
            if(it == num_mp.end()){
                num_mp.insert(make_pair(changeStr.second,1));
            }
        }

        for(int i = 0; i < check.size(); i++){ // 遍历检查黑名单
            for(it = num_mp.begin(); it != num_mp.end(); it++){
                string strTemp = getMaskPre(check[i], it->first); // 取前缀
                if(strmp[strTemp]){
                    result.push_back(check[i]);
                    break;
                }

            }
        }
        return result;
    }
};

int main(){
    Solution1 slove1;
    vector<string> result;
    vector<string> mask ={"10.166.170.0/24"};
    vector<string> check = {"10.166.170.181", "100.95.132.22", "10.166.170.199", "10.166.170.1"};

    result = slove1.maskCheckBack(mask, check);

    for(int i = 0; i< result.size(); i++){
        cout<<result[i]<<endl;
    }

    system("pause");
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值