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

发布时间:2024年01月24日

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();
文章来源:https://blog.csdn.net/weixin_46275441/article/details/135816604
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。