给定一个仅包含数字 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'] 的一个数字。
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-medium/xv8ka1/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> anss;
if(digits.empty())return anss;
unordered_map<char,string> mymap{
{'2',"abc"},
{'3',"def"},
{'4',"ghi"},
{'5',"jkl"},
{'6',"mno"},
{'7',"pqrs"},
{'8',"tuv"},
{'9',"wxyz"}
};
string ans;
huisu(digits,anss,mymap,0,ans);
return anss;
}
void huisu(const string& digits,vector<string>& anss,unordered_map<char,string>& mymap,int index,string& ans){
if(index == digits.length()){
anss.push_back(ans);
}else
{
char digit = digits[index];
const string& details = mymap.at(digit);
for(const char& detail:details){
ans.push_back(detail);
huisu(digits,anss,mymap,index+1,ans);
ans.pop_back();
}
}
}
};
这里的知识点就是push_back 也可以用在string里。
这道题主要的难题就是for循环的设置,如果我们选择两个就要循环两次,选3个要循环3次。这个是不可控的,这是就应该用到回溯的方法来解决此问题。在代码里我们只用写一个for循环一直递归就好了。进入循环先将detail保存到string里,在回溯的时候再将他保存到vector容器里