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);            
            }        
        }   
    }
}


相关文章
|
机器学习/深度学习 人工智能 自然语言处理
ChatGPT的应用与发展趋势:解析人工智能的新风口
ChatGPT的应用与发展趋势:解析人工智能的新风口
586 0
|
算法 Linux 数据安全/隐私保护
【linux】root大王如何制约普通用户——权限管理
【linux】root大王如何制约普通用户——权限管理
|
消息中间件 Kafka 数据处理
实时计算 Flink版产品使用合集之消费Kafka数据时,实现限流如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
前端开发 Scala
Scala并发编程的react、loop方法详解
在这个例子中,`MyActor`会无限循环接收和处理消息。当收到一个字符串消息时,它会打印出"Received: "加上消息内容。如果收到其他类型的消息,它会打印"Unknown message"。
87 1
|
缓存 编译器 Go
golang内存模型-1 chan解决Happens Before
golang内存模型-1 chan解决Happens Before
|
人工智能 弹性计算 物联网
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
|
存储 弹性计算 大数据
阿里云服务器的介绍和使用
阿里云服务器的介绍和使用
147 0
|
C语言
【C语言进阶篇】看完这篇结构体文章,我向数据结构又进了一大步!(结构体进阶详解)(下)
【C语言进阶篇】看完这篇结构体文章,我向数据结构又进了一大步!(结构体进阶详解)(下)
332 0
|
数据采集 物联网 Serverless
Serverless与IoT实践:为智能音箱赋能
本文通过与IoT能力进行结合,让Serverless架构在智能音箱中,发挥有趣的作用。
407 0
Serverless与IoT实践:为智能音箱赋能