/**
* 17. 电话号码的字母组合
* @author wsq
* @date 2020/09/24
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
*/
package notsubmit.huishuo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class LetterCombinations {
private List<String> ans = new ArrayList<String>();
@SuppressWarnings("unchecked")
private static Map<Character, String> letterMap = 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 ans;
}
StringBuilder sb = new StringBuilder();
genLetterStr(digits, 0, sb);
return ans;
}
private void genLetterStr(String digits, int i, StringBuilder sb) {
// TODO Auto-generated method stub
if(i == digits.length()) {
ans.add(sb.toString());
return;
}
char c = digits.charAt(i);
String letters = letterMap.get(c);
for(char tmpC: letters.toCharArray()) {
sb.append(tmpC);
genLetterStr(digits, i+1, sb);
sb.deleteCharAt(sb.length() - 1);
}
}
public static void main(String[] args) {
String s = "23";
LetterCombinations lc = new LetterCombinations();
List<String> ans = lc.letterCombinations(s);
for(String ss: ans) {
System.out.println(ss);
}
}
}
17. 电话号码的字母组合
最新推荐文章于 2024-10-09 11:13:12 发布