给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:“23”
输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public List<String> letterCombinations(String digits) {
String s[] = digits.trim().split("");
System.out.println("ss length is "+s.length);
Map<String, String> phone = new HashMap<String, String>() ;
phone.put("2", "abc");
phone.put("3", "def");
phone.put("4", "ghi");
phone.put("5", "jkl");
phone.put("6", "mno");
phone.put("7", "pqrs");
phone.put("8", "tuv");
phone.put("9", "wxyz");
List<String> res = new ArrayList<String> ();
StringBuilder temp = new StringBuilder();
if(s.length==0){
return res;
}
if(digits==" "){
return res;
}
//获取流程: 应该 获取数字的第一位 ,获取一种可能性,然后进入下一层,知道层数 等于 数字长度
//dep =0 int [] used = new int []
int dep =0 ;
buildhelp(s,s.length,dep,phone,temp,res);
return res;
}
// 0.传入分割好后的数组数组 1.传入数字长度,2.当前深度 3.map 4.当前的路径 5.res结果集 6.判断是否访问过该节点
public void buildhelp(String[]s,int length ,int dep, Map<String,String> phone, StringBuilder temp , List<String> res){
//获取层次 :
if(dep == length){
res.add(temp.toString());
return ;
}
//没有到达最后一层 :获取当前层次的字母
// int dd = dep+2;
//通过dep 找到第i个数字 ,然后在map中取出 对应的 字母
String ss= phone.get(s[dep]);
System.out.println("ss is "+ss );
//防止 输入 "" 上层函数分割之后仍有 1的长度,故在此处拦截
if(ss== null){
return ;
}
// System.out.println("dep is "+dep +" s[dep] "+s[dep]+ " ss is ----"+ss);
String [] sss = ss.split("");
// 选中节点 ,进入下一层 -- ,回溯节点
for(int i=0;i<sss.length;i++){
temp.append(sss[i]);
dep++;
//前往下一层添加节点
buildhelp(s,length,dep,phone,temp,res);
//重置状态不选择当前的i 选择下一个i作为当前层次节点
dep--;
temp.deleteCharAt(temp.length()-1);
}
}
}