赞
踩
日期:2023.1.23
参考:代码随想录、力扣
难度:中等
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
示例 2:
输入:digits = “”
输出:[]
示例 3:
输入:digits = “2”
输出:[“a”,“b”,“c”]
提示:
class Solution { public: #define SOLUTION 1 #if SOLUTION == 1 // 映射 vector<string> n2c_map = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; vector<string> results; string path; vector<string> letterCombinations(string digits) { if (digits == "") return results; backtracking(digits, 0); return results; } void backtracking(string digits, int index) { // 终止条件 if (path.size() == digits.size()) { // index == size results.push_back(path); return; } size_t num = (digits[index]-'0') - 2; // 将字符转换为数字,注意作为索引从0开始,0->2, 9->7 // for 循环遍历集合(index记录当前遍历到digits第几个数字,集合长度即为该数字对应的字符个数) // index 在进入下一层递归时会+1,从而对下一个数字的字符集合进行遍历 for (int i = 0; i < n2c_map[num].size(); i++) { // 处理节点 path.push_back(n2c_map[num][i]); // 递归 backtracking(digits, index + 1); // 回溯 path.pop_back(); } } #endif };
如对于输入"2379",2和3有三个字母,7和9有四个字母,则最多可遍历 3*3*4*4次(每个数字都能各自取3或4次并组合)
将问题转换为树形结构,并模拟遍历、递归回溯过程很有帮助
本题中,for循环每次要遍历的集合为某个数字对应的所有字符(如2对应"abc"),不同于之前的题目,递归不需要在当前集合上进行(即不需要通过递归在“abc"中连续取值,即求的是不同集合之间的组合),因此不需要startindex
来记录起始位置
至于递归,从当前层进入下一层递归,整个集合需要改变,即从digits的当前数字递归到其下一个数字对应的集合,因此通过一个n2c_map
来表示数字到字母的映射,就可以通过index
表示当前遍历到digits的第几个数字,并能获取该数字对应的字符集合;同时,每次进入递归时,在参数上传入index + 1
,可自动对index
进行回溯
其他的则按照模板写就好了。
注意:如果是现场面试,一定要考虑到异常情况(如输入”1 * #“等情况)的处理。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。