刷题笔记:力扣第17题-电话号码的字母组合
1.题目不难理解本质上就是一类找全部组合的问题需要用到递归算法2-9每个数字都代表一层递归。可以定义一个字符串数组vis来记录2-9的字母映射同时定义一个数组visLen记录2-9映射的字母数量1. const char *vis[8] {abc, def, ghi, jkl, mno, pqrs, tuv, wxyz}; 2. const int visLen[8] {3, 3, 3, 3, 3, 4, 3, 4};递归里面的终止条件为当前指针等于传入的数字字符串长度复制path的字符串到tmp并记录到结果数组之后返回。每层递归的核心逻辑为遍历当前数字对应的全部字母记录每一个本层字母的时候都可以进入下一层递归本层字母全都取过后自动返回上一层。2.基于以上思想可写出完整代码如下1. /** 2. * Note: The returned array must be malloced, assume caller calls free(). 3. */ 4. 5. // 数字2~9 对应字母的映射表指针数组最标准写法 6. // 索引 0 → 数字2索引1→数字3 ... 索引7→数字9 7. const char *vis[8] {abc, def, ghi, jkl, mno, pqrs, tuv, wxyz}; 8. 9. // 每个数字对应多少个字母3个或4个 10. const int visLen[8] {3, 3, 3, 3, 3, 4, 3, 4}; 11. 12. char* path; // 回溯时保存当前正在拼接的字母组合 13. int pathSize; // 当前组合的长度 14. char** res; // 最终结果保存所有字母组合 15. int resSize; // 最终结果有多少个组合 16. 17. void dfs(int startStr, char* digits, int len){ 18. // 递归终止条件 19. // 已经处理完所有数字 → 当前path是一个完整组合 20. if (startStr len){ 21. // 给这个组合分配内存1 存字符串结束符 \0 22. char* tmp (char*)malloc(sizeof(char) * (pathSize 1)); 23. // 把当前path复制到新内存 24. memcpy(tmp, path, sizeof(char) * pathSize); 25. // C语言字符串必须加结束符 26. tmp[pathSize] \0; 27. // 放入结果集 28. res[resSize] tmp; 29. return; 30. } 31. 32. // 核心回溯循环 33. // 遍历当前数字对应的所有字母 34. for (int cur 0; cur visLen[digits[startStr] - 2]; cur){ 35. // 选一个字母加入当前组合 36. path[pathSize] vis[digits[startStr] - 2][cur]; 37. // 递归处理下一个数字 38. dfs(startStr 1, digits, len); 39. // 回溯撤销选择删掉最后一个字母 40. pathSize--; 41. } 42. } 43. 44. char** letterCombinations(char* digits, int* returnSize) { 45. // 初始化全局变量 46. pathSize resSize 0; 47. int len strlen(digits); 48. 49. // 分配结果数组空间最多 4^4 256 种组合 50. res (char**)malloc(sizeof(char*) * 256); 51. // 分配临时组合空间最长 len 个字母 52. path (char*)malloc(sizeof(char) * (len 1)); 53. 54. // 开始回溯 55. dfs(0, digits, len); 56. 57. // 返回结果数量 58. *returnSize resSize; 59. // 返回所有组合 60. return res; 61. }该算法的时间复杂度为O(3^m×4^n)其中m是对应3个字母的数字个数2,3,4,5,6,8n是对应4个字母的数字个数7,9空间复杂度为O(len)已是本题最优解。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2433585.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!