17. 电话号码的字母组合
难度:中等
标签:回溯算法
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:“23”
输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].
思路:
1.排列组合,可以考虑用回溯算法
2.难点在于,每一层都代表一个数对应的字母,然后选择一个
import java.util.ArrayList;
import java.util.List;
public class Solution {
public static void main(String[] args) {
letterCombinations("23");
}
public static List<String> letterCombinations(String digits){
if(digits.length()==0) return null;
List<String> lists=new ArrayList<>();
ArrayList<String> num=new ArrayList<>();
//将2-9对应的字符存储在数组中
num.add(null);num.add(null);
num.add("abc");
num.add("def");
num.add("ghi");
num.add("jkl");
num.add("mno");
num.add("pqrs");
num.add("tuv");
num.add("wxyz");
StringBuffer str=new StringBuffer();
int pos1=0;
DFS(lists,0,digits,num,digits.length(),str,pos1);
return lists;
}
private static void DFS(List<String> lists,int pos,String digits,ArrayList<String> num,int level,StringBuffer str,int pos1){
if(str.length()==level){
//已经找到最后一层了
lists.add(new String(str));
}
else {
int len=digits.charAt(pos1)-'0';
pos--;
for(int i=pos+1;i<num.get(len).length();i++){
//添加进去
str.append(num.get(len).charAt(i));
//继续往下一层
DFS(lists,pos+1,digits,num,level,str,pos1+1);
//删除,回溯
str.deleteCharAt(str.length()-1);
}
}
}
}