[DFS]电话号码的字母组合
这道题目的本质是笛卡尔积问题,可以通过DFS求解,分别采用C/Java语言实现
#include <stdio.h>
#include <stdlib.h>
char *phoneMap[10] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
static char **combinations; // 记录最终结果
static int combinations_size;
static char *combination; // 记录每次回溯的字符串
static int combination_size;
void backtrack(char *digits, int size, int index) {
if (index == size) {
char *tmp = (char *) malloc(sizeof(char) * (combination_size + 1));
memcpy(tmp, combination, sizeof(char) * (combination_size + 1));
combinations[combinations_size++] = tmp;
return;
}
char *letters = phoneMap[digits[index] - '0'];
int len = strlen(letters);
for (int i = 0; i < len; i++) {
combination[combination_size++] = letters[i];
combination[combination_size] = '\0'; // 记录结束标识
backtrack(digits, size, index + 1);
combination[--combination_size] = '\0'; // 状态复原
}
}
char **letterCombinations(char *digits, int *returnSize) {
combinations_size = combination_size = 0; // 在入口函数初始化0,不然leetcode编译报错
int digits_size = strlen(digits);
if (digits_size == 0) {
*returnSize = 0;
return combinations;
}
int num = 1;
for (int i = 0; i < digits_size; i++) num *= 4;
combinations = (char **) malloc(sizeof(char *) * num);
combination = (char *) malloc(sizeof(char *) * digits_size);
backtrack(digits, digits_size, 0);
*returnSize = combinations_size;
return combinations;
}
int main() {
char *str = "23";
int ret = 0;
char **res = letterCombinations(str, &ret);
for (int i = 0; i < ret; i++) {
printf("%s\n", *(res + i));
}
}
本文作者:__Helios
本文链接:https://www.cnblogs.com/ffopen/p/17745371.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步