😄😊😆😃😄😊😆😃
开始cpp刷题之旅。
目标:执行用时击败90%以上使用 C++ 的用户。
17. 电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
示例 2:
输入:digits = “”
输出:[]
示例 3:
输入:digits = “2”
输出:[“a”,“b”,“c”]
解题:
借代码随想录的一张图,这题目的意思大概就是如下这样的。
几个数字就有几层。
我们要收集的结果,就是[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”]
对与n个不定的for循环,我们可以采用回溯。
如“23”,先推入2中的a,再将3中的d、e、f推推入结果中,要不断的推入、保存、删除,
当取完3中的字符,再取出字符a,再推入字符b,再重复同样的动作。到2中的字符取完为止。
class Solution {
public:
vector<string>str;
string s;
//定义string类型数组,将0和1没有字符的数字表示为空字符。
const string letterMap[10] = {
"", // 0
"", // 1
"abc", // 2
"def", // 3
"ghi", // 4
"jkl", // 5
"mno", // 6
"pqrs", // 7
"tuv", // 8
"wxyz", // 9
};
void backtracking(const string& digits, int index){
if(digits.size()==index){
str.push_back(s);
return;
}
int digit = digits[index] - '0'; //字符转数字
string letters = letterMap[digit]; //取出索引对应的字符串
for(int i=0;i<letters.size();i++){
s.push_back(letters[i]); //推入字符
backtracking(digits,index+1); //递归重复进行此动作
s.pop_back(); //取出字符,开始推入下一个字符。
}
}
vector<string> letterCombinations(string digits) {
if (digits.size() == 0) {
return str;
}
backtracking(digits,0);
return str;
}
};
提交记录: