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

17. 电话号码的字母组合(中)

时间:2024-01-21 14:55:39浏览次数:26  
标签:digits 数字串 17 combination backtrack next result 电话号码 字母组合

目录

题目

题解:回溯

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        if not digits:#检查输入的数字串 digits 是否为空
            return []
        a = {"2": "abc", "3": "def", "4": "ghi", "5": "jkl", "6": "mno", "7": "pqrs", "8": "tuv", "9": "wxyz"}#定义字典 a,其中键为数字字符,值为对应的字母字符串
        def backtrack(combination, next_digits):#combination 表示当前的字母组合,next_digits 表示剩余的数字串。
            if len(next_digits) == 0:#若剩余的数字串为空,说明已经生成了一个完整的组合,将其添加到结果列表 result 中。
                result.append(combination)  # 将当前组合添加到结果列表中
            else:#如果剩余的数字串不为空
                current_digit = next_digits[0]#取出剩余数字串的第一个数字
                letters = a[current_digit]  # 通过字典 a 获取当前数字对应的字母字符串
                for letter in letters:
                    combination += letter#将当前字母 letter 添加到当前组合 combination 中
                    backtrack(combination, next_digits[1:])#递归调用 backtrack 函数,传入更新后的参数 combination 和去掉第一个数字的剩余数字串 next_digits[1:]
                    combination = combination[:-1]  #撤销选择,回溯到上一层,恢复状态,去除最后一个字母
        result = []
        backtrack("", digits)  # 初始调用回溯函数,传入空字符串和输入的数字串
        return result

标签:digits,数字串,17,combination,backtrack,next,result,电话号码,字母组合
From: https://www.cnblogs.com/lushuang55/p/17974374

相关文章

  • 17-Linux系统定时任务
    crontab服务管理注意点使用前先确认crontab的守护进程crond是否是打开的状态,一般是开机自启的。[root@192mnt]#systemctlstatuscrond#查看crond进程是否开启。当前是开启的●crond.service-CommandSchedulerLoaded:loaded(/usr/lib/systemd/system/crond.ser......
  • P8651 [蓝桥杯 2017 省 B] 日期问题
    这道题虽然逻辑很简单,但是坑不少,一不留神就WA了要记得去重+排序#include<iostream>#include<stdio.h>#include<algorithm>#include<string>#include<set>#defineFor(i,j,n)for(inti=j;i<=n;++i)usingnamespacestd;stringdate;set<......
  • CF1763C
    Updateon2023.8.17:修正了一处小错误。分析题目可知,答案至少为\(\sum_{i=1}^{n}a_i\)。接下来考虑怎样使答案更大。可以对\(n\)分成如下几类情况讨论:\(n=2\)这种情况十分简单,如果选择操作最多一次,否则两次就会变为\(0\)。用$\left|a_1-a_2\right|\times2$判......
  • P4747 [CERC2017] Intrinsic Interval 题解
    题目链接:IntrinsicInterval讲讲析合树如何解决这种问题,其实这题很接近析合树的板题的应用。增量法进行析合树建树时,需要用ST表预处理出\(max\)和\(min\)以便\(O(1)\)查询极差,然后线段树去维护\([l,r]\)上的极差减区间端点做差即\(diff-(r-l)\),当这玩意等于\(0\)时......
  • AT_abc179_e
    题意定义\(f(x,m)=x\bmodm\)。有一个序列\(a\),满足\(a_1=1\),\(a_i=f(a_{i-1}^2,m)\)。求\[\sum_{i=1}^na_i\]思路这道题\(n\)的数据范围很大,但\(m\)最多只有\(10^5\),因此考虑以此为突破口。需要用到如下的同余性质:\[(a\timesb)\bmodm=(a\bmodm\times......
  • AT_abc179_d
    题意给定\(n\)和\(k\)个区间,并且保证$k\le10$且互不相交。可以进行任意次操作,每次可以选择一个整数\(j\),\(j\)要满足在其中一个给定的区间上,从当前位置向右移动\(j\)的距离。求\(1\)到\(n\)的方案数。思路提供一种数据结构的做法。依次枚举\(1\)到\(n\)......
  • CF1712A
    看完题目,很容易得知要使$\sum\limits_{i=1}^kp_i$最小,且\(p_i\)是\(n\)的一个排列,可以知道最终的答案为\(\sum\limits_{i=1}^ki\)。现在我们考虑如何将原序列转化成答案序列。得知答案后,我们要做的就是将所有的\(p_i\lek\)移到序列的前\(k\)位中。暴力枚举序列的......
  • CF1760A
    题意\(T\)组数据,每组数据给\(3\)个数,要求选出既不是最大值也不是最小值的那个数。做法这题由于十分简单,因此各种做法均可通过。最朴素的做法为比较出最大值和最小值,然后对三个数依次判断,找出符合条件的那个数即可。Code#include<iostream>#include<cstdio>usingnames......
  • CF1760C
    题意\(T\)组数据,每组数据给定一个长度为\(n\)的序列\(s\)。求出每个数与最大值的差(最大值本身除外),以及最大值和次大值的差(最大值的位置),按照原来的顺序输出。做法模拟题,十分简单,只需对原序列求最大值和次大值即可,然后再按位置输出。Code具体实现细节见代码。#include<io......
  • CF1760B
    题意\(T\)组数据,每次给定一个只含小写字母的字符串,求要拼出这个句子至少需要长度为多少的字母表。定义长度为\(x\)的字母表含有\(26\)字母表上的前\(x\)个字母。做法转化一下题目,很容易发现题目本质上就是要求字符串中最大的字母在\(26\)字母表中的位置。其它不是最大......