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']
的一个数字。
思路
本题和前几题回溯不太一样,前几题是要把int类型放进答案,这题是将字符组成字符串然后放入答案,其实没有什么不同,我使用了StringBuilder来传递字符串和添加/删除字符,但是这样的时间不知道是不是最佳的。
class Solution {public List<String> letterCombinations(String digits) {List<String> res=new ArrayList<>();if(digits.length()==0){return res;}StringBuilder ans=new StringBuilder();backtracking(0,digits,ans,res);return res;}public void backtracking(int depth,String digits,StringBuilder ans,List<String> res){if(depth==digits.length()){res.add(ans.toString());return;}int k=Character.getNumericValue(digits.charAt(depth));String temp="";switch(k){case 2:temp="abc";break;case 3:temp="def";break;case 4:temp="ghi";break;case 5:temp="jkl";break;case 6:temp="mno";break;case 7:temp="pqrs";break;case 8:temp="tuv";break;case 9:temp="wxyz";break;}for(int i=0;i<temp.length();i++){ans.append(temp.charAt(i));backtracking(depth+1,digits,ans,res);ans.deleteCharAt(ans.length()-1);}}}
时间复杂度:O(3m×4n),m是对应三个字母的数字个数(2,3,4,5,6,8),n是对应四个字母的数字个数(7,9)
空间复杂度:O(m+n),递归调用层数最大为m+n