题目描述
// 17. 电话号码的字母组合
// 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按
// 任意顺序 返回。
// 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
题解
// 回溯搜索法
//
// 在类中创建Map<String, String> map,将数字对应的字符串组成键值对储存到map中,
// 在类中创建答案储存位res,用于储存最终答案。
//
// 主函数先排序digits为空的时候,
// 然后调用回溯搜索函数backtrack开始递归,
// 定义回溯搜索函数,输入为字符串组合combination,和需要转化的成字符串的数字
// nextDigits。在递归的过程中,如果需要转化的数字nextDigits被使用完了,长度为0;
// 则递归终止,将combination存入答案res中。
// 如果nextDigits还有内容,从左取nextDigits的第一个数字,记为digit,
// 通过map映射获得digit对应的字母串letters,
// for循环遍历letters字母串当中的单个字母letter,遍历索引为i,
// 实际是遍历letters的长度,然后通过.substring(i, i + 1)方法来遍历
// letters字母串中的单个字母,记为letter。
// 递归调用回溯搜索函数backtrack,将letter通过String 加法加到combination中,
// nextDigits则为的.substring(1)。如此循环,最后所有排列的情况都被存入res,
// 返回res即可。
import java.util.HashMap;
class Solution {
List<String> res = new ArrayList<String>();
Map<String, String> phoneMap = new HashMap<>() {{
put("2", "abc");
put("3", "def");
put("4", "ghi");
put("5", "jkl");
put("6", "mno");
put("7", "pqrs");
put("8", "tuv");
put("9", "wxyz");
}};
public List<String> letterCombinations(String digits) {
if (digits.length() == 0)
return res;
backtrack("", digits);
return res;
}
public void backtrack(String combination, String nextDigits) {
if (nextDigits.length() == 0) {
res.add(combination);
}
else {
String digit = nextDigits.substring(0, 1);
String letters = phoneMap.get(digit);
for (int i = 0; i < letters.length(); i++) {
String letter = letters.substring(i, i + 1);
backtrack(combination + letter, nextDigits.substring(1));
}
}
}
}