【力扣】17. 电话号码的字母组合 - 力扣(LeetCode)

这里主要是记录一些我做这个题遇到的问题及解决办法

1.问题描述

在这里插入图片描述

1.1 思路分析;

  这个回溯法的关键是要理解递归,在递归的基础上再理解回溯法,尤其是当递归结束和循环结束后下一步应该运行到哪里?return可以返回到上一层递归,但是当最后循环结束时也能回到上一层递归,可以调试看看每一步运行过程

2.程序代码及注释:

2.1 C-回溯法-详细代码解释-暴力

/**
* Note: The returned array must be malloced, assume caller calls free().
*/
char* convert[] = {"",    "",    "abc",  "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; // 映射长度
char** ans;
char path[6];
int n, pathsize, anssize;
// 这种写法是错误的,全局变量是无法在定义以后赋值的,只能初始化赋值,否则会在编译阶段报错:
//  int pathsize=0;
//  int anssize=0;
//  pathsize=0;
//  anssize=0;
void backtracking(char* digits, int index) {
   if (index == strlen(digits)) {
       // 保存结果,先申请一下临时内存(一级指针),每次都要申请一个,用于保存结果,然后用二级指针指向这个结果
       //这里不能用全局变量字符串数组,必须动态的每次进行申请内存
       char* temp = (char*)malloc(sizeof(char) *(n + 1)); // 明确为什么是n+1;因为最后一位要存'\0',也就是成为字符串;
       for (int i = 0; i < strlen(digits); i++)temp[i] = path[i];
       temp[index] = '\0';
       ans[anssize++] = temp;
       return;
   }
   char* letter = convert[digits[index] - '0'];
   for (int i = 0; i < strlen(letter); i++) {
       path[pathsize++] = letter[i];
       backtracking(digits, index + 1);
       pathsize--; // return 后函数第一条执行的语句
                   // for循环结束后,自动返回到上一层函数,返回上一层函数后继续执行pathsize--,也就是执行了两次pathsize--
                   // 第一次是最后return后, pahouthsize--,pathsize==2;
                   // 第二次是最后一次递归循环中i==3,结束最后一次递归,返回第二次递归,因此从pathsize--开始执行
                   // pathsize==1,也就是相当于退回嵌套循环的倒数第二次循环;
   }
}
char** letterCombinations(char* digits, int* returnSize) {
   n = strlen(digits);
   ans = (char**)malloc(sizeof(char*) * 300);
   //path = (char*)malloc(sizeof(char) * n); // 临时保存每次结果,可以申请内存,也可以直接定义个全局字符串数组变量,长度>=6即可
   anssize = pathsize = 0;
   if (n == 0) {
       *returnSize = 0;
       return ans;
   }
   backtracking(digits, 0);
   *returnSize = anssize;
   return ans;
}

  • 17
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值