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

电话号码的字母组合

时间:2023-08-22 11:56:20浏览次数:27  
标签:digits index 数字 combinations 字母 put 电话号码 字母组合

回溯问题:回溯算法用于寻找所有的可行解

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

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

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

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());//完整的序列放入List中
        } else {
            char digit = digits.charAt(index);//取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,index,数字,combinations,字母,put,电话号码,字母组合
From: https://www.cnblogs.com/zhaowang888/p/huisu_01.html

相关文章

  • 西农OJ P1491 城市电话号码
    题目描述某城市电话号码包括地区码、前缀、有效号码三部分组成,其中地区码是0-4位数字;前缀是以非0开头的3位数字,有效号码是4位数字,各部分之间用减号(-)分隔,地区码为空时地区码与前缀之间不包含分隔符。请编写函数检测输入号码num的有效性,若输入号码符合上述规定返回0,否则返回1。函......
  • 193. 有效电话号码
    给定一个包含电话号码列表(一行一个电话号码)的文本文件 file.txt,写一个单行bash脚本输出所有有效的电话号码。你可以假设一个有效的电话号码必须满足以下两种格式:(xxx)xxx-xxxx或 xxx-xxx-xxxx。(x表示一个数字)你也可以假设每行前后没有多余的空格字符。示例:假设 file.txt ......
  • 17. 电话号码的字母组合(letterCombinations)
    给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合。答案可以按任意顺序返回。给出数字到字母的映射如下(与电话按键相同)。注意1不对应任何字母。示例1:输入:digits="23"输出:["ad","ae","af","bd","be","bf","cd","ce","cf"......
  • 常用电话号码
    常用电话号码生活服务常用电话号码服务名称电话号码服务名称电话号码短信报警号码(部分城市开通)12110短信报警号码(部分城市开通)12110国际电话区号86国际电话区号86匪警台110匪警台110火警台119火警台119医疗急救台120医疗急救台120信息......
  • IOS开发-iOS中电话号码和邮箱判断
    在iOS应用中我们经常会遇到一些个人信息的设置,需要判断用户输入的信息是否正确,电话号码和邮箱等是否符合要求,下面直接上代码:1,判断字符串是否是电话号码:-(BOOL)checkTelNumber:(NSString*)telNumber{NSString*pattern=@"^1+[3578]+\\d{9}";NSPredicate*pred=[N......
  • 代码随想录算法训练营第二十一天| 216.组合总和III 17.电话号码的字母组合
    216.组合总和III  思路:很像上一个组合类型的题目,唯一不同的就是自己写一个sum代码:1voidconvertBST_cur(TreeNode*root,vector<TreeNode*>&nodes)2{3if(!root)return;4if(root->left)convertBST_cur(root->left,nodes);5nodes.push_bac......
  • 代码随想录算法训练营第25天 | ● 216.组合总和III ● 17.电话号码的字母组合 - 第7章
     第七章 回溯算法part02 今日内容:  ●  216.组合总和III●  17.电话号码的字母组合  详细布置   216.组合总和III  如果把 组合问题理解了,本题就容易一些了。  题目链接/文章讲解:https://programmercarl.com/0216.%E7%BB%84%E5%90%88%E6%80%B......
  • 代码随想录算法训练营第二十五天|216. 组合总和 III、17. 电话号码的字母组合
    【参考连接】216.组合总和III【注意】1.组合不强调元素之间的顺序。【代码】1classSolution(object):2def__init__(self):3self.res=[]4self.sum_now=05self.path=[]6defcombinationSum3(self,k,n):7......
  • 2023谷歌账号登陆检测到异常活动验证,提示此电话号码无法用于验证的原因深度解析
    谷歌Gmail账号检测到异常活动验证,出现“此电话号码无法用于验证”问题,可能出现在注册时或者注册后使用一段时间。针对注册时无法使用手机号的解决办法,网上已经可以搜到相关文章了。这篇文章将主要针对谷歌账号成功注册一段时间后——Google提示我们检测到您尝试登录的帐户有异常活......
  • 【2023最新】谷歌账号登陆提示正在通过短信自动验证没有输入框一片空白,多次尝试出现异
    2022在谷歌商店登陆谷歌账号,遇到卡在手机号验证上,谷歌提示正在通过短信自动验证您的电话号码,这可能需要几分钟时间……但是手机上已经收到了谷歌的验证码,却无法进行下一步,页面一片空白没有出现输入框,这是怎么回事?没有下一步可以输入验证码的地方出现,一直停在下图正在验证的界面上。......