题目描述:
已知0-9的数字对应字母集合,分别是0对应’a’,‘b’,‘c’,数字1对应’d’,‘e’,‘f’,数字2对应’g’,‘h’,‘i’,数字3对应’j’,‘k’,‘l’,
数字4对应’m’,‘n’,‘o’,数字5对应’p’,‘q’,‘r’,数字6对应’s’,‘t’,数字7对应’u’,‘v’,数字8对应’w’,‘x’,数字9对应’y’,‘z’;
输入两行入参:
第一行是全数字(0-9),个数小于等于5;
第二行是屏蔽字符(a-z);
输出参数:
按数字顺序组合的字符串列表,除去屏蔽条件,全部输出
示列1:
输入:
78
ux
输出:
uw
vw
vx
示列2:
输入:
78
x
输出:
uw
vw
c++代码实现
#include <unordered_map>
#include <iostream>
#include <vector>
#include <string>
std::unordered_map<int,std::vector<char>> map_v{{0,{'a','b','c'}},{1,{'d','e','f'}},{2,{'g','h','i'}},{3,{'j','k','l'}},
{4,{'m','n','o'}},{5,{'p','q','r'}},{6,{'s','t'}},{7,{'u','v'}},{8,{'w','x'}},{9,{'y','z'}}};
void dfs(const std::vector<int>& int_vec,int index, std::vector<bool>& visit, const std::string& dis_str,std::string& out_str, std::vector<std::string>& final_vec ){
if(index==int_vec.size()){
final_vec.push_back(out_str);
return;
}
int i = index;
for(;i!=int_vec.size();++i){
//for(int i=0;i!=int_vec.size();++i){
if(visit[i])
continue;
visit[i] = true;
std::vector<char>& vec_ch = map_v[int_vec[i]];
for(int j=0;j!=vec_ch.size();++j){
out_str.append(1,vec_ch[j]);
if(out_str.size() >= dis_str.size()){
std::string temp_str = out_str.substr(out_str.size()-dis_str.size(),dis_str.size());
if(temp_str == dis_str){
out_str.pop_back();
continue;
}
}
dfs(int_vec,++index,visit,dis_str,out_str,final_vec);
out_str.pop_back();
index--;
}
visit[i] = false;
}
}
int main(){
string input_s1,ds_s2;
getline(cin,input_s1);
getline(cin,ds_s2);
std::vector<int> int_vec;
for(int i=0;i!=input_s1.size();++i){
int_vec.push_back(input_s1[i]-'0');
}
std::vector<bool> visit(int_vec.size(),false);
std::string out_str;
std::vector<std::string> final_vec;
dfs(int_vec,0,visit,ds_s2,out_str,final_vec);
for(int i=0;i!=final_vec.size(); ++i){
std::cout << final_vec[i] << " " << std::endl;
}
return 0;
}