解题思路:
// 解题思路: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;
}