题目
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
题解
首先给出数字对应字母的映射:
数字 | 字母 |
---|---|
2 | a、b、c |
3 | d、e、f |
4 | g、h、i |
5 | j、k、l |
6 | m、n、o |
7 | p、q、r、s |
8 | t、u、v |
9 | w、x、y、z |
利用递归函数,对数字进行递归求解。分割字符串 "23456…" 为 "2" 、 "3456…" ,对单个字符串 "2" 寻找其对应的字母 [a、b、c] ,之后将其与该函数计算剩下字符串所组合而成的字符组合相拼接,从而得到最终结果。代码如下:
public List<String> letterCombinations(String digits) {
List<String> S = new ArrayList<String>();
if(digits.length() == 0) {
return S;
}
char first_value = digits.charAt(0);
String digits_cut = digits.substring(1);
String block = "";
switch (first_value) {
case '2':
block = "abc";
break;
case '3':
block = "def";
break;
case '4':
block = "ghi";
break;
case '5':
block = "jkl";
break;
case '6':
block = "mno";
break;
case '7':
block = "pqrs";
break;
case '8':
block = "tuv";
break;
case '9':
block = "wxyz";
break;
default:
break;
}
List<String> L_back = this.letterCombinations(digits_cut);
for(int i = 0; i < block.length(); i++) {
if(L_back.size() == 0) {
String value = block.charAt(i) + "";
S.add(value);
continue;
}
for(int j = 0; j < L_back.size();j++) {
String value = block.charAt(i) + L_back.get(j);
S.add(value);
}
}
return S;
}