力扣top100-17. 电话号码的字母组合-回溯
题目:
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入:digits = ""
输出:[]
示例 3:
输入:digits = "2"
输出:["a","b","c"]
准备:
数据方面得有个Map来存放(5,"jkl")
得需要一个数组存放答案列表
算法选择-回溯
如果是遍历的话,时间复杂度可能要要起飞
但是可以考虑,取第i个数字为5,相当于这个字符串可能是xxxxjxxxx,xxxxkxxxx,xxxxlxxxx
这样答案就能构成一个树型结构
遍历答案树怎么做??回溯啊
具体方案
用一个字符串,最好是个StringBuilder,可变的,类似于遍历树一样,不断的回溯
应该还算简单
具体代码
public class T0017 {
public List letterCombinations(String digits) {
List res =new ArrayList<>();//答案列表
if(digits==null){//边界条件判断
return null;
}else if (digits.length()==0)return res;
StringBuilder sb=new StringBuilder();//类似于答案的递归栈,要么全局,要么往方法中传参
Map numMap=new HashMap<>(){{
put('2', "abc");
put('3', "def");
put('4', "ghi");
put('5', "jkl");
put('6', "mno");
put('7', "pqrs");
put('8', "tuv");
put('9', "wxyz");
}};
function(digits,numMap,sb,0,res);
return res;
}
public void function(String digits,Map numMap,StringBuilder sb,int i,List res){
if(i==digits.length()){
//res.add(new String(String.valueOf(sb)));
res.add(sb.toString());
return;
}
String sub=numMap.get(digits.charAt(i));//取出数字对应的几个字符
for (int j = 0; j < sub.length(); j++) {
sb.append(sub.charAt(j));//插入元素
function(digits,numMap,sb,i+1,res);//遍历下一个数字
sb.deleteCharAt(i);//回溯,弹出元素
}
}
}