1.电话号码的字母组合
思路一:回溯
class Solution { public: vector<string> letterCombinations(string digits) { vector<string> combinations; if (digits.empty()) { return combinations; }//边界条件 unordered_map<char, string> phoneMap{ {'2', "abc"}, {'3', "def"}, {'4', "ghi"}, {'5', "jkl"}, {'6', "mno"}, {'7', "pqrs"}, {'8', "tuv"}, {'9', "wxyz"} };//哈希表存储每个数字对应的字母 string combination; backtrack(combinations, phoneMap, digits, 0, combination);//字符串数组,哈希表,数字字符串,索引,字母字符串 return combinations; } void backtrack(vector<string>& combinations, const unordered_map<char, string>& phoneMap, const string& digits, int index, string& combination) { if (index == digits.length()) { combinations.push_back(combination);//索引超过给定电话号码的长度,就生成一个解 } else { char digit = digits[index]; const string& letters = phoneMap.at(digit);//依次回溯digit里面的每个字母 for (const char& letter: letters) { combination.push_back(letter); backtrack(combinations, phoneMap, digits, index + 1, combination); combination.pop_back(); } } } };