LeetCode 电话号码的字母组合
发布时间:2020-12-14 04:18:25 所属栏目:大数据 来源:网络整理
导读:题目 (https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/) 问题分析 刚拿到这道题的时候没什么思路,只能顺着逻辑想。每个数字对应着三个或者四个字母,也就是说每个位置我们会有三个或者四个选择。那么似乎我们可以用递归来解决
题目(https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/) 问题分析刚拿到这道题的时候没什么思路,只能顺着逻辑想。每个数字对应着三个或者四个字母,也就是说每个位置我们会有三个或者四个选择。那么似乎我们可以用递归来解决问题,因为每个位置的字母我们都需要做多种选择,而做出这种选择后下一个位置同样也需要这么做。那么我们先依据这个思路写一个递归函数 /* C++代码 */ /* ret 为储存最终结果的数组 map 是字母到数字的映射表 digits 是一串要转换数字 s 由数字转换成的字符串 */ void fun(vector<string>& ret,const char map[8][5],const string& digits,string& s) { if (s.length() < digits.length()) { for (int i = 0; i < strlen(map[(digits[s.length()] - ‘0‘) - 2]); i++) { s.push_back(map[(digits[s.length()] - ‘0‘) - 2][i]); fun(ret,map,digits,s); s.pop_back(); } } else if (s.length() == digits.length()) { ret.push_back(s); } } 可能有朋友发现这就是一个深度优先搜索的过程,那么恭喜,后面的内容将十分容易理解,如果没有反应过来,后面还有图片助于理解。 由于最终我们要返回一个数组给LeetCode,外层套上一个函数 /* C++代码 */ vector<string> letterCombinations(string digits) { vector<string> ret; if (digits.length() == 0) { return ret; } char map[8][5] = { {‘a‘,‘b‘,‘c‘,0},{‘d‘,‘e‘,‘f‘,{‘g‘,‘h‘,‘i‘,{‘j‘,‘k‘,‘l‘,{‘m‘,‘n‘,‘o‘,{‘p‘,‘q‘,‘r‘,‘s‘,{‘t‘,‘u‘,‘v‘,{‘w‘,‘x‘,‘y‘,‘z‘,0} }; string s; fun(ret,s); return ret; } 时间复杂度O(4^n),空间复杂度O(n)。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |