LeetCode #17 电话号码的字母组合
Posted 三笠·阿卡曼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode #17 电话号码的字母组合相关的知识,希望对你有一定的参考价值。
题目
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
示例
代码
package com.vleus.algorithm.backtrack;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author vleus
* @date 2021年06月27日 10:34
*/
public class LetterCombination {
//用一个Map记录数字和字母的对应关系
Map<Character,String> numberMap = new HashMap<Character,String>(){
{
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) {
//定义List保存结果
List<String> result = new ArrayList<>();
//用一个StringBuffer保存当前一个可行解
StringBuffer combination = new StringBuffer();
//判空直接返回
if ("".equals(digits)){
return result;
}
//递归方法,传入当前考察的数字位置,初始为0
backtrack(digits,result,combination,0);
return result;
}
//定义回溯方法
public void backtrack(String digits, List<String> result, StringBuffer combination, int i) {
int n = digits.length();
//判断当前深度搜索是否完成,如果完成,直接添加到result
if (i >= n) {
result.add(combination.toString());
}else{
//如果没搜索完,需要处理当前的数字
char digit = digits.charAt(i);
//取出可能对应的字母
String letters = numberMap.get(digit);
//遍历所有可能的字母
for (int j = 0; j < letters.length(); j++) {
//添加当前字母到可行解中
combination.append(letters.charAt(j));
//继续深度搜索下一个数字,递归调用
backtrack(digits,result,combination,i+1);
//状态回溯,回退状态
combination.deleteCharAt(i);
}
}
}
}
以上是关于LeetCode #17 电话号码的字母组合的主要内容,如果未能解决你的问题,请参考以下文章