import java.util.ArrayList;
import java.util.List;
/**
* leetcode17:电话号码的字母组合
* 题目:给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
* 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
*
* 输入:digits = "23"
* 输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
*
* 输入:digits = ""
* 输出:[]
*
* 输入:digits = "2"
* 输出:["a","b","c"]
* @author
* @create 2021-04-21 23:41
*/
public class Solution17 {
public static void main(String[] args) {
String letters = "23";
List<String> strings = letterCombinations(letters);
System.out.println(strings);
}
/**
* 方法一:回溯,和排列的做法相同
* @param digits
* @return
*/
static List<String> list = new ArrayList<>();//保存结果
//数字和字母的映射,用map存储也可以
static String[] letter_map = {"","*","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
public static List<String> letterCombinations(String digits){
if (digits == null || digits.length() == 0){
//边界条件,直接返回
return list;
}
StringBuilder builder = new StringBuilder();//用来拼接字符
callback(builder,digits,0);//开始调用递归
return list;
}
public static void callback(StringBuilder builder, String digits, int index){
if (index == digits.length()){
//当digits遍历到最后一位时将拼接好的字符放入list中
list.add(builder.toString());
}else {
//取digits的字符。比如“23”,index=0取2,index=1取3
char c = digits.charAt(index);
//对应的下标
int in = c - '0';
//取下标对应的字母,比如,2-->“abc”
String letters = letter_map[in];
for (int i = 0; i < letters.length(); i++) {
//先拼接1个字符
builder.append(letters.charAt(i));
//递归往后拼接
callback(builder,digits,index+1);
//回溯,删除最后一个字符
builder.deleteCharAt(builder.length() - 1);
}
}
}
}
【leetcode】17题:电话号码的字母组合
最新推荐文章于 2023-07-25 17:28:10 发布