给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = "23" 输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入:digits = "" 输出:[]
示例 3:
输入:digits = "2" 输出:["a","b","c"]
提示:
0 <= digits.length <= 4
digits[i]
是范围['2', '9']
的一个数字。
vector<string>vecStr={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
vector<vector<bool>>visited=vector<vector<bool>>(10,vector<bool>(4,false));
void backtrack(vector<string>&ret,string digits,int cur,std::deque<char>&stk,vector<vector<bool>>&visited)
{
if(stk.size() == digits.size())
{
deque<char>tmpStk=stk;
string str="";
while(!tmpStk.empty()){
str = str+ tmpStk.front();
tmpStk.pop_front();
}
if(str!="")
{
ret.push_back(str);
}
}
for(int i=cur;i<digits.size();i++)
{
int cTmp=digits[i]-'0';
string tmpStr=vecStr[cTmp];
for(int j=0;j<tmpStr.size();j++)
{
if(visited[i][j]==true)
{
continue;
}
visited[i][j]=true;
stk.push_back(tmpStr[j]);
backtrack(ret, digits,i+1,stk,visited);
visited[i][j]=false;
stk.pop_back();
}
}
}
vector<string> letterCombinations(string digits) {
vector<string>ret;
deque<char>stk;
backtrack(ret, digits, 0,stk,visited);
return ret;
}