描述
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
示例 2
输入:digits = “2”
输出:[“a”,“b”,“c”]
分析
当题目中出现 “所有组合” 等类似字眼时,我们第一感觉就要想到用回溯。
代码
import java.util.ArrayList;
import java.util.List;
/**
* @author taoke
* @desc 电话号码的组合
* @email 1504806660@qq.com
* @date 2022/2/8
*/
public class FindCombination {
/**
* 保存结果
*/
private final List<String> res = new ArrayList<>();
/**
* 字母的集合
*/
private final String[] letters = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
/**
* 所有字母的组合
*
* @param digits 数字
* @return 所有字母的组合
*/
public List<String> letterCombinations(String digits) {
if (!"".equals(digits)) {
findCombination(digits, 0, "");
}
return res;
}
/**
* 用回溯法寻找所有字母的组合
*
* @param digits 数字
* @param index 数字的索引
* @param s 临时变量
*/
private void findCombination(String digits, int index, String s) {
if (index == digits.length()) {
res.add(s);
return;
}
char c = digits.charAt(index);
String letter = letters[c - '0'];
for (int i = 0; i < letter.length(); i++) {
findCombination(digits, index + 1, s + letter.charAt(i));
}
}
}