文章目录
给一个不包含’0’和’1’的数字字符串,每个数字代表一个字母,请返回其所有可能的字母组合。下图的手机按键图,就表示了每个数字可以代表的字母。
输入: “23”
输出: [“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”]
解释:
‘2’ 可以是 ‘a’, ‘b’ 或 ‘c’
‘3’ 可以是 ‘d’, ‘e’ 或 ‘f’
一、分析
- 排列组合的简单应用
- 先获取数字字符串的每一个数字字符,然后再获取每一个数字对应的字符串
- 再遍历这个字符串
- 再按上述逻辑递归下去即可
- 下图帮助理解
- 完整代码
String[] phoneLetters = {"","","abc","def","ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
public List<String> letterCombinations(String digits) {
List<String> results = new ArrayList<>();
if (digits.length() == 0){
return results;
}
StringBuilder sb = new StringBuilder();
helper02(digits, phoneLetters, 0, sb, results);
return results;
}
private static void helper02(String digits,
String[] phoneLetters,
int startIndex,
StringBuilder item,
List<String> results){
if (item.length() == digits.length()){
results.add( item.toString());
return;
}
//遍历 digits 获取其中每一个数字字符 且转换为数字
for (int i=startIndex; i<digits.length(); i++){
int num = digits.charAt(i) - '0';
//从事先定义好的字符串数组中 获取对应的字符串
String phoneString = phoneLetters[num];
//再 遍历该字符串
for (int j = 0; j<phoneString.length(); j++){
item.append(phoneString.charAt(j));
//开始递归到下一层 遍历digits的下一个字符
helper02(digits, phoneLetters, i+1, item, results);
//回溯
item.deleteCharAt(item.length() - 1);
}
}
}