典型的退后一步,这道题的字典的数据结构比较重要,不要因为字符长度不统一,没有数学规律,就想当然的map,还有数组呢,下坐标,哈哈
题目:
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23" 输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
解决办法,比较笨的数据结构:
public List<String> letterCombinations(String digits)
{
List<String> ret = new ArrayList<String>();
char[]arr=digits.toCharArray();
if(digits.length()==0){
return ret;
}
Map<String,List<String>> map= new HashMap<String,List<String>>();
List<String> l1=new ArrayList<String>();
l1.add("a");
l1.add("b");
l1.add("c");
map.put("2", l1);
List<String> l2=new ArrayList<String>();
l2.add("d");
l2.add("e");
l2.add("f");
map.put("3", l2);
List<String> l3=new ArrayList<String>();
l3.add("g");
l3.add("h");
l3.add("i");
map.put("4", l3);
List<String> l4=new ArrayList<String>();
l4.add("j");
l4.add("k");
l4.add("l");
map.put("5", l4);
List<String> l5=new ArrayList<String>();
l5.add("m");
l5.add("n");
l5.add("o");
map.put("6", l5);
List<String> l6=new ArrayList<String>();
l6.add("p");
l6.add("q");
l6.add("r");
l6.add("s");
map.put("7", l6);
List<String> l7=new ArrayList<String>();
l7.add("t");
l7.add("u");
l7.add("v");
map.put("8", l7);
List<String> l8=new ArrayList<String>();
l8.add("w");
l8.add("x");
l8.add("y");
l8.add("z");
map.put("9", l8);
String s="";
dpTree(arr,0,map,ret,s);
return ret;
}
public void dpTree(char[]arr,int level,Map<String,List<String>> map,List<String> ret,String str){
if(level==arr.length){
ret.add(str);
return;
}
String k=String.valueOf(arr[level]);
List<String> list=map.get(k);
for(int i=0;i<list.size();i++){
String s=str+list.get(i);
dpTree(arr,level+1,map,ret,s);
}
}
好的字典:
private static final String[] DICTIONARY = {
" ",
"",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz",
};
static List<String> res = new ArrayList<>();
public List<String> letterCombinations(String digits) {
if(digits == null || digits.equals("")){
return res;
}
res.clear();
doCombination(digits, 0, "");
return res;
}
private void doCombination(String digits, int index, String s) {
if(index == digits.length()){
res.add(s);
return;
}
char current = digits.charAt(index);
String tmp = DICTIONARY[current - '0'];
for(int i = 0; i < tmp.length(); i++){
doCombination(digits, index + 1, s + tmp.charAt(i));
}
}
哈哈