给定一个仅包含数字?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;
? ? }