题目
现在有一个手机,手机上的键盘上有这样的对应关系,2对应”abc”,3对应”def”…..手机里面有一个userlist用户列表,当我们输入942的时候出来拼音的对应可能是“xia”,“zha”,“xi”,“yi”等,当我们输入9264的时候出来是yang,可能是“样”,“杨”,“往”等,现在我们输入一个字符串数字,比如926等,要在电话簿userlist中查找出对应的用户名和电话号码并返回结果。 C++语言: 电话号码对应的英语单词(注意此题的非递归做法)
来源
百度
代码
/*-------------------------------------
* 日期:2015-03-30
* 作者:SJF0115
* 题目: 电话号码对应英语单词
* 来源:百度
* 博客:
------------------------------------*/
#include <iostream>
#include <vector>
using namespace std;
//每个数字键对应的字母个数
vector<int> count = {0,0,3,3,3,3,3,4,3,4};
vector<string> letter = {"","","ABC","DEF","GHI","JKL","MNO","PQRS","TUV","WXYZ"};
// phone 电话号码 n 电话号码位数 index
void RecursiveSearch(vector<int> phone,vector<char> &path,int index,int n,vector<vector<char> > &result){
if(index == n){
result.push_back(path);
return;
}//if
int num = phone[index];
for(int i = 0;i < count[num];++i){
path.push_back(letter[num][i]);
RecursiveSearch(phone,path,index+1,n,result);
path.pop_back();
}//for
if(count[num] == 0){
RecursiveSearch(phone,path,index+1,n,result);
}//if
}
// 非递归
vector<vector<char> > NoRecursiveSearch(vector<int> phone){
vector<vector<char> > result;
vector<char> path;
int size = phone.size();
if(size <= 0){
return result;
}//if
// 数字键目前所代表的字符在所能代表的字符集中的位置
vector<int> answer(size,0);
while(true){
for(int i = 0;i < size;++i){
path.push_back(letter[phone[i]][answer[i]]);
}//for
result.push_back(path);
path.clear();
int k = size - 1;
// 每一个数字对应的字母位置
while(k >= 0){
if(answer[k] < count[phone[k]] - 1){
answer[k]++;
break;
}//if
else{
answer[k] = 0;
k--;
}//else
}//while
if(k < 0){
break;
}//if
}//while
}
// 打印
void Print(vector<vector<char> > result){
for(int i = 0;i < result.size();++i){
for(int j = 0;j < result[i].size();++j){
cout<<result[i][j];
}//for
cout<<endl;
}//for
}
int main(){
vector<vector<char> > result;
vector<char> path;
vector<int> phone = {3,2,4};
RecursiveSearch(phone,path,0,phone.size(),result);
Print(result);
cout<<endl;
result = NoRecursiveSearch(phone);
Print(result);
}