给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:“23”
输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
思路分析:
意图很明显了,就是让我们找到所有字母对应号码长度的全排列,全排列代表的就是深度DFS搜索。
我们可以完全套用模板.照着写就行。
代码实现:
public static List<String> letterCombinations(String digits) {
List list = new ArrayList();
if(digits.length()==0)return list;
StringBuilder str = new StringBuilder();
HashMap<Character,String> map = new HashMap<>();
map.put('2',"abc");
map.put('3',"def");
map.put('4',"ghi");
map.put('5',"jkl");
map.put('6',"mno");
map.put('7',"pqrs");
map.put('8',"tuv");
map.put('9',"wxyz");
int i = 0;
backtrack(list, str, digits, map,i);
System.out.print(list);
return list;
}
//static List h = new ArrayList();
public static void backtrack(List list,StringBuilder str,String digits,HashMap<Character, String>map,int i) {
if (str.length()==digits.length()||i>=digits.length()) {
String b = str+"";
list.add(b);//达到要求,加入列表
return;
}
char[] b = map.get(digits.charAt(i)).toCharArray();
for(char a:b) {
str.append(a);///扩大子列
backtrack(list, str, digits, map,i+1);//对step+1进行操作
str.deleteCharAt(str.length()-1);//撤销
}
}
总结和问题:
在写代码时候,对str进行括容时候使用StringBuilder,后直接压入列表,发现最后的结果随着Stringbuilder的值一起变化,后来经过调试,发现将Str放入List,实质放入的是str的地址,若不将StringBuilder进行转换为String,则列表内的内容也一起变化。