leetcode 17
题目描述:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入:digits = ""
输出:[]
示例 3:
输入:digits = "2"
输出:["a","b","c"]
本题思路
因为还是根据所给定的字符串中表示字母的组合,所有考虑可以用回溯三部曲,来解决。
返回值与参数
因为本题与之前的组合不太一样,不只是单纯的取出数字,还要根据数字对应的字母,进行组合,所以,可以考虑数字与字母的映射,定义一个二维数组:
private:
const string letterMap[10] = {
"",//0
"",//1
"abc",//2
"def",//3
"ghi",//4
"jkl",//5
"mno",//6
"pqrs",//7
"tuv",// 8
"wxyz",// 9
};
用字符串s来收集叶子节点的结果,同时保存在result中;参数设定一个int类型的index,记录遍历到第几个数字,同时也表示树的深度。
vector<string> result;
string s;
void backtracking(const string& digits,int index)
终止条件
当输入为“23”,根节点向下递归两层就可以了,叶子节点就是要收集的结果集。终止条件就是如果index等于输入的两个数,就收集结果,结束本层递归。
if(index==digits.size())
{
result.push_back(s);
return;
}
递归
单层遍历逻辑,首先获取下标index指向的数字,并找到对应的字符集(手机键盘的字符集)。然后用for循环处理这个字符集:
int digit = digits[index] - '0'; //将index指向的数字转为int类型
string letters = letterMap[digit]; //从获取数字对应的字符集
for (int i = 0;i < letters.size();i++)
{
s.push_back(letters[i]);
backtracking(digits,index + 1);
s.pop_back();
}
整体代码
class Solution {
private:
const string letterMap[10] = {
"",//0
"",//1
"abc",//2
"def",//3
"ghi",//4
"jkl",//5
"mno",//6
"pqrs",//7
"tuv",// 8
"wxyz",// 9
};
public:
vector<string> result;
string s;
void backtracking(const string& digits,int index)
{
if (index == digits.size())
{
result.push_back(s);
return;
}
int digit = digits[index] - '0'; //将index指向的数字转为int类型
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) {
s.clear();
result.clear();
if(digits.size() == 0)
{
return result;
}
backtracking(digits,0);
return result;
}
};
标签:digits,index,string,组合,int,back,问题,result,回溯
From: https://www.cnblogs.com/7xiaomao/p/16784915.html