首页 > 其他分享 >leetcode 17.电话号码的字母组合

leetcode 17.电话号码的字母组合

时间:2024-01-18 13:36:47浏览次数:34  
标签:digits 17 字母 combinations put 电话号码 字母组合 leetcode

leetcode 17.电话号码的字母组合

第十七题:电话号码的字母组合

1.回溯:

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

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

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

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

标签:digits,17,字母,combinations,put,电话号码,字母组合,leetcode
From: https://www.cnblogs.com/ldy20020324/p/17972296

相关文章

  • 2024-01-17
    所谓滑动窗口就是不断移动子序列的起始位置和终止位置,从而得到我们想要的结果。Integer.MAX_VALUE表示int数据类型的最大取值数:2147483647Integer.MIN_VALUE表示int数据类型的最小取值数:-2147483648力扣-滑动窗口-904:找出至多包含两种元素的最长子串,返回其长度classSolutio......
  • 从JDK8升级到JDK17:探索JAVA的新特性和改进
    升级到JDK17的必要性JDK8提供了很多实用且常用的特性,例如lambda表达式等,再加上超长的支持时间(JDK8支持到2030年,比JDK11的2026年和JDK17的2029年都要长)。而从JDK9往后,JDK的发布周期也缩短为6个月,也间接导致每个版本的新特性相对较少,大家的对新特性的提升感知不强,所以升级欲望不是......
  • .net 温故知新【17】:Asp.Net Core WebAPI 中间件
    一、前言到这篇文章为止,关于.NET"温故知新"系列的基础知识就完结了,从这一系列的系统回顾和再学习,对于.NETcore、ASP.NETCORE又有了一个新的认识。不光是从使用,还包括这些知识点的原理,虽然深入原理谈不上,但对于日常使用也够了,我想的是知其然,知其所以然。在实际开发过程中可能......
  • 2024/1/17 算法笔记
    1.欧拉质数筛功能是给一个整数n查找小于等于n的所有质数。最后使用的是prime【i】//功能:查找n内第x个质数。boolisprime[100000010];//isprime[i]=1表示:i是素数intprime[6000010],cnt=0;//prime存质数voidgetprime(intn){//筛到n也就是n以内的质数memset(is......
  • 1.17每日总结
    Python3基本数据类型Python中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在Python中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。等号(=)用来给变量赋值。等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在......
  • 20240117
    从whk如活着回来了~~~觉得还是日更好以后就每天写一点喵主要是文章太少看着难受CF771DBearandCompany肯定是\(dp\),然后自己想的就没了qwq考虑如下的状态\(dp_{v,k,x,0/1}\)表示当前用了\(v,k,x\)个每种字符,最后一个字符是不是v的最小操作数考虑转移,每次多一个字......
  • 2024.1.17日报
    2.1.4.1persist方法和cache方法RDD通过persist或cache方法可以将前面的计算结果缓存,但是并不是这两个方法被调用时立即缓存,而是触发后面的action时,该RDD将会被缓存在计算节点的内存中,并供后面重用。通过查看RDD的源码发现cache最终也是调用了persist无参方......
  • 从嘉手札<2024-1-17>
    昨天我以为人生是一场体验是一辆不会回头的列车我们遇到了风景感悟了风景放下了风景构成了自己今天我以为静水流深、光而不耀可多思必多疑思维是一种极为复杂的东西我曾经觉得知行合一是对自我内心的绝对控制后来发觉这只不过是骗局因为王阳明成功了所以我认可知行......
  • 闲话1.17
    今天摆了。写了写jimmy题单,感觉题大部分还不错......
  • Stack-array based implementation【1月17日学习笔记】
    点击查看代码//Stack-arraybasedimplementation#include<iostream>usingnamespacestd;#defineMAX_SIZE101intA[MAX_SIZE];//globleinttop=-1;//globlevoidpush(intx){ if(top==MAX_SIZE-1){ cout<<"error:stackoverflow"&l......