晋江网站制作,龙之向导外贸,什么好的主题做网站,服装网站的设计理念题目
17. 电话号码的字母组合
中等
相关标签
哈希表 字符串 回溯
给定一个仅包含数字 2-9 的字符串#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下#xff08;与电话按键相同#xff09;。注意 1 不对应任何字母。…题目
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 4digits[i] 是范围 [2, 9] 的一个数字。
思路和解题方法 代码首先定义了一个常量数组 letterMap其中每个元素表示数字0-9对应的字符集合。这样我们可以通过数字来索引 letterMap 中的元素得到对应的字符集合。接下来代码定义了两个成员变量 ans 和 s分别用于存储最终的答案集合和临时的组合结果。然后代码定义了一个递归函数 backtracking该函数通过参数 digits 和 index 来表示当前处理的数字串和目前处理到的位置。在 backtracking 函数中当 index 等于 digits 的大小时说明已经找到了一种组合将 s 加入到答案集合 ans 中并返回。否则获取当前位置的数字 digit以及它对应的字符集合 letters。接下来通过循环遍历当前数字对应的每个字符并将其依次加入到临时组合结果字符串 s 中。然后递归调用 backtracking 函数处理下一个数字的字母组合。最后在完成递归调用后进行回溯操作将刚才加入的字符移出继续尝试下一个字符。在主函数 letterCombinations 中首先清空临时字符串 s 和答案集合 ans。然后判断输入的数字串是否为空如果为空直接返回空的答案集合。否则调用 backtracking 函数开始搜索字母组合。最后返回最终的答案集合。 复杂度 时间复杂度: O(3m×4n) 算法的时间复杂度为 O(3m×4n)其中 m 表示输入数字串中对应字母集合大小为 3 的数字个数n 表示输入数字串中对应字母集合大小为 4 的数字个数。因为一般情况下一个数字对应 3 个字母另外两个数字对应 4 个字母所以总的时间复杂度为 O(3m×4n)。 空间复杂度 O(mn) 空间复杂度为 O(mn)即递归栈的深度。在最坏情况下所有数字都对应字母集合大小为 4所以根据上面的时间复杂度分析有 mn 个数字需要进行搜索因此栈的深度也为 mn所以空间复杂度为 O(mn)。 c 代码
class Solution {
public:const string letterMap[10]{, // 数字0对应的字母为空字符串因为通常没有字母对应数字0, // 数字1对应的字母为空字符串因为通常没有字母对应数字1abc, // 数字2对应的字母为abcdef, // 数字3对应的字母为defghi, // 数字4对应的字母为ghijkl, // 数字5对应的字母为jklmno, // 数字6对应的字母为mnopqrs, // 数字7对应的字母为pqrstuv, // 数字8对应的字母为tuvwxyz // 数字9对应的字母为wxyz};vectorstring ans; // 存储最终的答案集合string s; // 用于临时存储每个组合结果的字符串void backtracking(string digits,int index){if(index digits.size()) // 如果达到了数字串的末尾说明已经找到了一种组合将其加入到答案集合中{ans.push_back(s);return ;}int digit digits[index] - 0; // 获取当前位置的数字string letters letterMap[digit]; // 获取当前数字对应的字母集合for(int i0;iletters.size();i) // 遍历当前数字对应的每个字母{s.push_back(letters[i]); // 将字母加入到临时组合结果字符串中backtracking(digits,index 1); // 继续递归下一个数字的字母组合s.pop_back(); // 回溯将刚才加入的字母去除尝试下一个字母}}vectorstring letterCombinations(string digits) {s.clear(); // 清空临时字符串sans.clear(); // 清空答案集合ansif(digits.size() 0) // 如果输入的数字串为空则直接返回空的答案集合{return ans;}backtracking(digits,0); // 开始回溯搜索字母组合return ans; // 返回最终的答案集合}
};觉得有用的话可以点点赞支持一下。
如果愿意的话关注一下。会对你有更多的帮助。 每天都会不定时更新哦 人 。