关键:
1. 将字母与下标做映射。(二维数组
2.将遍历到的字符串 digits ,的字符串,转化为数字。例如 " 2 " -----> 2 。以便可以在二维数组中做映射,找到对应的字符串。
3. backtracking 中的参数。index 就是用来遍历 string digits 的,这个大小 需要和 digits.size() 是比较。
调用backtracking的时候,index + 1。而不是 i + 1。
4. 终止条件比较难想。 一般我们用 循环遍历的话,终止条件都是 i < size。
但这里递归的终止条件是 i == size。我认为是,当 i == size 之后,本来就没对 string 函数进行任何操作了,只是把path 加入 res,最后返回。
但循环 其实 也是 在 i == size 之后,停止的,因为每次操作完之后 i 会 ++。所以当最后一次比较的时候,i 其实 == size 的。 所以也没对 其进行操作。
二刷:
1.发现自己。。在写二维数组的时候各个字符串之间没有加逗号,,,
2. 需要注意,定义的是 string path 和 vector<string> res
class Solution {
public:
// 如何将字母与下标 映射?
const string letterMap[10] = {
"", // 0
"", // 1
"abc", // 2
"def", // 3
"ghi", // 4
"jkl", // 5
"mno", // 6
"pqrs", // 7
"tuv", // 8
"wxyz", // 9
};
vector<string> res;
string path;
void backtracking(const string &digits, int index)
{
if(index == digits.size())
{
res.push_back(path);
return;
}
int digit = digits[index] - '0';
string letters = letterMap[digit];
for(int i = 0; i < letters.size(); i++)
{
path.push_back(letters[i]);
backtracking(digits, index + 1);
path.pop_back();
}
return ;
}
vector<string> letterCombinations(string digits) {
if(digits.size() == 0)
return res;
backtracking(digits, 0);
return res;
}
};