问题原始链接 https://leetcode.com/problems/letter-combinations-of-a-phone-number
给定一个数字字符串,返回这个数能表示的所有的字母组合。
数字与字母的关系(像电话按钮)如下所示。
例子:
输入: 数字字符串 "23" 输出: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
public class Solution {
private static String[][] digitToStr = { { " " }, {}, { "a", "b", "c" },
{ "d", "e", "f" }, { "g", "h", "i" }, { "j", "k", "l" },
{ "m", "n", "o" }, { "p", "q", "r", "s" }, { "t", "u", "v" },
{ "w", "x", "y", "z" }, { "*" }, { "#" } };
public static List<String> letterCombinations(String digits) {
if (digits == null || digits.length() == 0) {
return new ArrayList<String>();
}
List<StringBuilder> sbs = new ArrayList<StringBuilder>();
for (int i = 0; i < digits.length(); i++) {
char c = digits.charAt(i);
if (!Character.isDigit(c) && c != '*' && c != '#') {
continue;
}
int index = Character.isDigit(c) ? Character.getNumericValue(c)
: c == '*' ? 10 : 11;
String[] str = digitToStr[index];
if (sbs.isEmpty()) {
for (int j = 0; j < str.length; j++) {
StringBuilder sb = new StringBuilder();
sbs.add(sb);
sb.append(str[j]);
}
} else {
int l = sbs.size();
for (int k = 0; k < l; k++) {
sbs.get(k).append(str[0]);
}
for (int j = 1; j < str.length; j++) {
for (int k = 0; k < l; k++) {
StringBuilder sb = new StringBuilder().append(sbs.get(k));
sbs.add(sb);
sb.setCharAt(sb.length() - 1, str[j].charAt(0));
}
}
}
}
List<String> result = new ArrayList<String>(sbs.size());
for (int i = 0; i < sbs.size(); i++) {
result.add(sbs.get(i).toString());
}
return result;
}
}