😄😊😆😃😄😊😆😃
开始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;}
};
提交记录: