当前位置: 首页 > java >正文

【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"]

提示:

  • 0 <= digits.length <= 4
  • digits[i] 是范围 ['2', '9'] 的一个数字。

解题思路:

通过回溯法遍历所有的字母组合,先建立数字和字母的对应关系,处理边界情况,并计算左右组合数,再通过回溯算法生成所有组合,最后收集结果并返回。

代码解释:

digits: 输入的数字字符串;

index: 当前处理的数字索引;

current: 当前已生成的组合;

result: 存储所有结果的数组;

returnSize: 结果的数量;

代码:

​
const char *digitMap[] = {"",     // 0"",     // 1"abc",  // 2"def",  // 3"ghi",  // 4"jkl",  // 5"mno",  // 6"pqrs", // 7"tuv",  // 8"wxyz"  // 9
};
void backtrack(const char *digits, int index, char *current, char **result, int *returnSize) {if(digits[index]=='\0') {result[*returnSize]=(char*)malloc(strlen(current)+1);strcpy(result[*returnSize],current);(*returnSize)++;return;}int digit=digits[index]-'0';const char* letters=digitMap[digit];for(int i=0;letters[i]!='\0';i++) {current[index]=letters[i];current[index+1]='\0';backtrack(digits,index+1,current,result,returnSize);}
}
int calculateTotalCombinations(const char *digits) {if(digits[0]=='\0') return 0;int total=1;for(int i=0;digits[i]!='\0';i++) {int digit=digits[i]-'0';int len=strlen(digitMap[digit]);total*=len;}return total;
}
char **letterCombinations(const char *digits, int *returnSize) {*returnSize=0;if (digits==NULL||digits[0]=='\0') return NULL;int total=calculateTotalCombinations(digits);char** result=(char**)malloc(total*sizeof(char*));if(result==NULL) return NULL;int digitsLen=strlen(digits);char* current=(char*)malloc((digitsLen+1)*sizeof(char));if(current==NULL) {free(result);return NULL;}current[digitsLen]='\0';backtrack(digits,0,current,result,returnSize);free(current);return result;
}​

http://www.xdnf.cn/news/19349.html

相关文章:

  • 哪些人需要考道路运输安全员证?政策要求与适用范围
  • C++day2作业
  • 突破视界的边界:16公里远距离无人机图传模块全面解析
  • 毕业项目推荐:47-基于yolov8/yolov5/yolo11的焊缝质量检测识别系统(Python+卷积神经网络)
  • pip 镜像源配置(清华/阿里/豆瓣)详解
  • 智瞰风评 - 基于大语言模型的个人征信报告风险分析师
  • k8s--efk日志收集
  • 用简单仿真链路产生 WiFi CSI(不依赖专用工具箱,matlab实现)
  • Java数组入门教程:零基础掌握数组定义与遍历+新手避坑指南
  • Python3 lambda(匿名函数)
  • 轻量xlsx读取库xlsx_drone的编译与测试
  • 元素滚动scrollIntoView
  • A5M2(数据库管理工具)下载安装
  • 谈物质的运动与运动的物质
  • 智能消防栓闷盖终端:让城市消防管理更智慧高效
  • Robolectric拿到当前的Activity
  • 基于轴重转移补偿和多轴协调的粘着控制方法研究
  • 线性回归算法
  • Lombok(简化Java当中的开发)
  • 下载 | Win11 23H2正式版最新原版ISO系统映像 (22631.5840、多合一版本)-修复系统问题
  • 基于STM32单片机的OneNet物联网云平台农业土壤湿度控制系统
  • 编程与数学 03-004 数据库系统概论 09_物理结构设计
  • 栈溢出问题
  • 498. 对角线遍历
  • 银河麒麟系统无法打开360浏览器的解决办法以及安装initramfs-tools报错解决方案
  • 10.2 工程学中的矩阵
  • AutoDriveRelated-WA
  • Qt中的锁(1)
  • 【lua】table基础操作
  • String str = new String(“abc“)