给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入:digits = ""
输出:[]
示例 3:
输入:digits = "2"
输出:["a","b","c"]
提示:
0 <= digits.length <= 4
digits[i] 是范围 [‘2’, ‘9’] 的一个数字。
方法一(递归)、
/**
* 递归处理数据
* @param realResult 结果数组
* @param tempResult 临时结果数组
* @param phoneMap digitLetter
* @param digits digits
*/
private static void recursion(List<String> realResult, List<String> tempResult, String[] phoneMap, String digits) {
//如果当前字母组合长度大于0
if(digits.length() > 0){
//获取第一个数字并更新数字字符串
String digit = digits.substring(0, 1);
digits = digits.substring(1);
//获取当前数字的所有字母
String[] letters = phoneMap[Integer.valueOf(digit)].split("");
if(realResult.size() > 0){
//清空临时结果数租组,把结果数组赋值到临时数组,清空结果数组
tempResult.clear();
tempResult.addAll(realResult);
realResult.clear();
//将临时数组合当前数字字母进行组合并添加到结果数组
for (String tempLetter : tempResult) {
for (String letter : letters) {
realResult.add(tempLetter+letter);
}
}
}else{
//如果结果数组为空,把所有字母存在结果数组
realResult.addAll(Arrays.asList(letters));
}
//递归更新后的数字字符串
recursion(realResult,tempResult,phoneMap,digits);
}
}
方法二(回溯)、
/**
* 回溯
* @param digits
* @return
*/
public List<String> letterCombinations2(String digits) {
String[] digitLetter = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
//结果数组
List<String> realResult = new ArrayList<>();
//处理数据
backtrack(realResult,digitLetter,digits,0,new StringBuilder());
return realResult;
}
public void backtrack(List<String> realResult, String[] phoneMap, String digits, int index, StringBuilder resultStr) {
if (index == digits.length()) {
//如果当前下标和字母字符串相等,则把一个结果放入结果数组中
realResult.add(resultStr.toString());
} else {
//如果当前下标和字母字符串不相等,继续向下一个数字递归
//获取当前下标的数字和字母
Integer digit = Integer.valueOf(digits.substring(index, index+1));
String letters = phoneMap[digit];
int lettersCount = letters.length();
for (int i = 0; i < lettersCount; i++) {
//循环将当前字符添加到结果字符串中,一直向下递归,直到得到一个结果字母字符串
resultStr.append(letters.charAt(i));
backtrack(realResult, phoneMap, digits, index + 1, resultStr);
//回溯回到上一个数字的循环时需要删掉之前添加的字母,方便添加对应数字的其他字母
resultStr.deleteCharAt(index);
}
}
}
转载于:https://www.ycblog.top/article?articleId=166&commentPageNum=1