方法一:回溯
class Solution {
private:
map<string,string> mp= { {"2","abc" },{"3","def"},
{"4","ghi"},{"5","jkl"},{"6","mno"},
{"7","pqrs"},{"8","tuv"},{"9","wxyz"} };
vector<string> res;
void backtrack(string combination,string next_digits){
if(next_digits.empty()) //满足条件
res.push_back(combination);
else{
string digit=next_digits.substr(0,1); //取第一个字母
string tmp=mp[digit]; //选择列表
for(int i=0;i<tmp.size();i++){
string letter=tmp.substr(i,1);
backtrack(combination+letter,next_digits.substr(1));
}
}
}
public:
vector<string> letterCombinations(string digits) {
if(!digits.empty())
backtrack("",digits);
return res;
}
};
方法二:队列
class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> res;
map<char,string> mp={{'2',"abc" },{'3',"def"},{'4',"ghi"},{'5',"jkl"},{'6',"mno"},{'7',"pqrs"},{'8',"tuv"},{'9',"wxyz"}};
int size=digits.size(); //输入字符串产长度
queue<string> q;
//先将第一个数字对应的码表入队
for(int i=0;i<mp[digits[0]].size();i++){
string str;
str.push_back(mp[digits[0]][i]);
q.push(str);
}
string s;
//将此string与后一个字符串所对应的码表中每一个值相加并逐步进入到队列中
for(int i=1;i<size;i++){
int length=q.size();
while(length--){
for(int j=0;j<mp[digits[i]].size();j++){
s=q.front();
s+=mp[digits[i]][j];
q.push(s);
}
q.pop();
}
}
//队列中存储的即为所有情况的string
while(!q.empty()){
res.push_back(q.front());
q.pop();
}
return res;
}
};