17. 电话号码的字母组合

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
通过dfs遍历所有的位,逻辑中遍历字母。
这里的使用的是map作为映射。也可以使用String数组。
String[] d = new String[]{" ",
"",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz"};
// 注意条件:digits是在[2,9]区间内
// 先整理数字和字母的映射。
Map<Character, String> map = new HashMap<>();
//结果
List<String> list = new ArrayList<>();
public List<String> letterCombinations(String digits) {
if(digits == null || digits.length() == 0) {
return ret;
}
prepareData();
dfs("", 0, digits);
return list;
}
public void prepareData() {
char prev = 'a'-1;
char ch = '2';
for(int i=2;i<=9;i++) {
int j=3;
if(i==7 ||i==9) {
j=4;
}
StringBuilder sb = new StringBuilder();
for(int t=0;t<j;t++) {
sb.append( (char)(prev+1));
if(t!=j-1) {
sb.append(",");
}
prev = (char)(prev+1);
}
map.put(ch, sb.toString());
ch = (char)(ch + 1);
}
}
// 思路:遍历数字,即digits的每位,在该数字下,遍历所有的可能项。
public void dfs(String str, int index, String digits) {
// 如果位遍历完了,就添加结果。
if(digits.length() == index) {
list.add(str);
return;
}
String[] strs = map.get(digits.charAt(index)).split(",");
// 遍历该数字下所有的字母。
for(String s : strs) {
dfs(str + s,index+1,digits);
}
}
浙公网安备 33010602011771号