17.电话号码的字母组合

简介: 17.电话号码的字母组合

题目:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

解题思路:

首先使用哈希表存储每个数字对应的所有可能的字母,然后进行回溯操作。

回溯过程中维护一个字符串,表示已有的字母排列(如果未遍历完电话号码的所有数字,则已有的字母排列是不完整的)。该字符串初始为空。每次取电话号码的一位数字,从哈希表中获得该数字对应的所有可能的字母,并将其中的一个字母插入到已有的字母排列后面,然后继续处理电话号码的后一位数字,直到处理完电话号码中的所有数字,即得到一个完整的字母排列。然后进行回退操作,遍历其余的字母排列。

回溯算法用于寻找所有的可行解,如果发现一个解不可行,则会舍弃不可行的解。在这道题中,由于每个数字对应的每个字母都可能进入字母组合,因此不存在不可行的解,直接穷举所有的解即可。

class Solution{
    public List<String>letterCombinations(String digits){
        List<String> combinations=new ArrayList<String>();
        if(digits.length()==0){
            return combinations;                            
        }  
        Map<Character,String>phoneMap=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");            
            }        
        } ;
        backtrack(combinations,phoneMap,digits,0,new StringBuffer());
        return combinations; 
    }
    public void backtrack(List<String>combinations,Map<Character,String>phoneMap,String digits,int index,StringBuffer combination){
        if(index==digits.length()){
            combinations.add(combination.toString());        
        } else{
            char digit=digits.charAt(index);
            String letters=phoneMap.get(digit);
            int lettersCount=letters.length();
            for(int i=0;i<lettersCount;i++){
                combination.append(letters.charAt(i));
                backtrack(combinations,phoneMap,digits,index+1,combination);
                combination.deleteCharAt(index);            
            }        
        }   
    }
}


相关文章
|
1月前
|
算法
Leetcode第十七题(电话号码的字母组合)
这篇文章介绍了如何使用深度优先搜索(DFS)算法来解决LeetCode第17题——电话号码的字母组合问题,通过递归方法生成所有可能的字母组合。
16 0
Leetcode第十七题(电话号码的字母组合)
|
1月前
|
算法
【LeetCode 52】17.电话号码的字母组合
【LeetCode 52】17.电话号码的字母组合
31 0
|
3月前
|
算法
LeetCode第17题电话号码的字母组合
该文章介绍了 LeetCode 第 17 题电话号码的字母组合的解法,通过分析得出可使用递归和回溯的思想解决,避免循环穷举的高循环次数,并给出了具体的编码实现,同时总结了该题较难理解,需要了解递归的本质,当嵌套循环层次多时可考虑递归。
LeetCode第17题电话号码的字母组合
|
5月前
17. 电话号码的字母组合
17. 电话号码的字母组合
|
6月前
|
Java
leetcode-17:电话号码的字母组合
leetcode-17:电话号码的字母组合
36 0
leetcode-17:电话号码的字母组合
|
11月前
|
存储 C++ 索引
电话号码的字母组合(C++实现)
电话号码的字母组合(C++实现)
68 0
|
机器学习/深度学习 算法 安全
LeetCode - #17 电话号码的字母组合
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
103 0
leetcode:17.电话号码的字母组合
可以抽象成一个排列组合的问题,题目的意思就是说当输入"23"的时候实际上就是按了两次按键,分别是2和3,然后2对应的是abc,3对应的是def,所以我们只需递归遍历每一种结果即可解决问题。
43 0
leetcode:17.电话号码的字母组合