Day24_216组合总数_17电话号码的字母组合

文章目录

      • [216 组合总数](https://programmercarl.com/0216.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8CIII.html)
      • [17 电话号码的字母组合](https://programmercarl.com/0017.%E7%94%B5%E8%AF%9D%E5%8F%B7%E7%A0%81%E7%9A%84%E5%AD%97%E6%AF%8D%E7%BB%84%E5%90%88.html)

216 组合总数

  1. 回溯三部曲:
  • 参数和返回值:没有返回值。参数传递组合个数k作为判断结束条件,参数n作为path中和的记录,startIndex作为下一次递归的开始。
  • 终止条件:如果path.size() == k 且 组合中数的和等于n的时候,表示组合数符合要求,记录在result中。反之,若path.size() != k 且 组合中数的和不等于n,表示这个组合不符合要求,直接return。
if (path.size() == k && n == 0){
	result.push_back(path);
	return;
}
if(path.size() > k) return;
  • 单层逻辑:从startIndex开始,先记录当前节点,修改节点的和,从当前节点的下一个节点开始递归,回溯恢复节点的和,回溯撤销当前节点。
for (int i = startIndex; i <= 9; i++){
	path.push_back(i);
	n = n - i;
	backtracking(k, n, i+1);
	n = n + i; //回溯恢复和
	path.pop_back(); // 回溯撤销当前节点
}

17 电话号码的字母组合

  1. 电话号码的数字字符串到字符字符串的映射:使用二维数组实现。
const string letterMap[10] = {
	"",//0
	"",//1
	"abc",//2
	"def",//3
	"ghi",//4
	"jkl",//5
	"mno",//6
	"pqrs",//7
	"tuv",//8
	"wxyz",//9
}
  1. 想想字符串之间的组合,横向的遍历是字符串的长度,纵向的遍历是字符串的个数。
  2. 回溯三部曲:
  • 返回值与参数:参数表示树的高度,字符串digits的下标,范围0~digits.size()。参数digits实现从字母到字符串的映射。返回值是void。
  • 终止条件:如果已经遍历了digits中的所有数字,则表示到达树低,结束。
if (startIndex == digits.size()) {
	result.push_back(tmp);
	return;
}
  • 单层逻辑
//数字字符到字符串转换
int index = digits[startIndex] - '0';
string letter = letterMap[index];
//横向遍历
for (int i = 0; i < letter.size(); i++){
	tmp += letter[i];//tmp.push_back(letter[i]);
	//纵向遍历
	backtracking(digits, startIndex + 1);
	//回溯
	tmp.resize(tmp.size() - 1);//tmp.pop_back();

你可能感兴趣的:(算法,数据结构,leetcode,力扣)