1、题目
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
示例 2:
输入:digits = “”
输出:[ ]
示例 3:
输入:digits = “2”
输出:[“a”,“b”,“c”]
题目链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number
2、图解
对于输入23,如下图所示。
- 显然这是一个组合问题,可能你会觉得着很简单,两层循环即可搞定,那么如果输入是234呢,可能你会说3层循环就好了。但是如果是23456789,难道写个8层循环吗。这时候递归就派上用场了。
- 模仿循环的过程,我们将每次递归得到的结果记录在一个变量letter中。假设下一次递归遇到的字符为c,则letter=letter+c。
_那么递归什么时候终止呢?我们还需要加一个变量index记录递归的层次,类似于循环到了层。当index==digits.length()的时候,递归就应该终止了。
上面说的是递归的过程该是什么样子。本题中不仅有递归,还有一个循环。因为其实存在2–>abc, 3–>def,……这样一个映射关系。我们可以将这种关系用一个数组telMap表示,telMap[2]就可以表示abc,telMap[3]就可以表示def。
代码
3、Java 示例代码
class Solution {
String[] telMap = {"_", "!@#", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
List<String> res = new ArrayList<String>();
public List<String> letterCombinations(String digits) {
if (digits == null || digits.length() == 0) {
return res;
}
process(digits, "", 0);
return res;
}
private void process(String digits, String letter, int index) {
//递归的第一步,确定终止条件,
if (index == digits.length()) {
res.add(letter);
return;
}
String str = telMap[digits.charAt(index) - '0'];
for (int i = 0; i < str.length(); i++) {
process(digits, letter + str.charAt(i), index + 1);
}
}
}
执行结果: