描述

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

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

示例:

输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

解析

方法:回溯

回溯是一种通过穷举所有可能情况来找到所有解的算法。如果一个候选解最后被发现并不是可行解,回溯算法会舍弃它,并在前面的一些步骤做出一些修改,并重新尝试找到可行解。

其实就是穷举法的优化。

优化

[LeetCode] 784. 字母大小写全排列 ☆☆☆(回溯、深度优先遍历)启发,每个char有有限个的选择,都可以使用此法。

代码

回溯

//me
class Solution {
static Map<String, String> map = new HashMap<>(); static {
map.put("2", "abc");
map.put("3", "def");
map.put("4", "ghi");
map.put("5", "jkl");
map.put("6", "mno");
map.put("7", "pqrs");
map.put("8", "tuv");
map.put("9", "wxyz");
} List<String> output = new ArrayList<String>();
public List<String> letterCombinations(String digits) {
if (digits == null || digits.length() <= 0) {
return output;
}
help(output, "", digits, 0);
return output;
} public void help(List<String> list, String tempStr, String digits, int pos) {
if (pos != tempStr.length()) {//每时每刻pos都应该和tempStr长度一样,否则就不是从第一个数字开始的
return;
}
if (pos == digits.length() /**&& tempStr.length() == pos**/) {
list.add(tempStr);
return;
}
for (int i = pos; i < digits.length(); i++) {
String curStr = digits.charAt(i) + "";
String mapStr = map.get(curStr);
for (int k = 0; k < mapStr.length(); k++) {
tempStr += mapStr.charAt(k);
help(list, tempStr, digits, i + 1);
tempStr = tempStr.substring(0, tempStr.length() - 1);
}
}
}
}

优化

    List<String> output = new ArrayList<>();
public List<String> letterCombinations(String digits) {
if (null == digits || digits.length() <= 0) {
return output;
}
phoneHelp1(digits.toCharArray(), output, 0);
return output;
} public void phoneHelp1(char[] chars, List<String> list, int start) {
if (start == chars.length) {
list.add(new String(chars));
return;
}
String mapStr = map.get(String.valueOf(chars[start]));
for (int i = 0; i < mapStr.length(); i++) {//从0开始,因为每个char都要重头遍历
char temp = chars[start];
chars[start] = mapStr.charAt(i);
phoneHelp1(chars, list, start + 1);
chars[start] = temp; //此循环就是很明显的回溯
}
}

[LeetCode] 17. 电话号码的字母组合 ☆☆☆(回溯) ###的更多相关文章

  1. [LeetCode] 17. 电话号码的字母组合(回溯)

    题目 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23" 输出:[& ...

  2. Java实现 LeetCode 17 电话号码的字母组合

    17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23& ...

  3. leadcode的Hot100系列--17. 电话号码的字母组合--回溯的另一种想法的应用

    提交leetcode的时候遇到了问题,一直说访问越界,但仔仔细细检查n多遍,就是检查不出来. 因为我用到了count全局变量,自加一来表明当前数组访问的位置, 后来突然想到,是不是在leetcode在 ...

  4. LeetCode 17. 电话号码的字母组合(Letter Combinations of a Phone Number)

    题目描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23" 输出: ...

  5. [LeetCode] 17. 电话号码的字母组合

    题目描述:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/ 题目描述: 给定一个仅包含数字 2-9 的字符 ...

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

    与子集70?类似,子集每次两个分支,本题每次k个分支,子集是第一次不push第二次push元素,本题是每次都push元素,因此,本题答案的长度都为k,子集题目为各种组合: /** res,level, ...

  7. Leetcode之回溯法专题-17. 电话号码的字母组合(Letter Combinations of a Phone Number)

    [Leetcode]17. 电话号码的字母组合(Letter Combinations of a Phone Number) 题目描述: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组 ...

  8. leetcode(js)算法之17电话号码的字母组合

    给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母 示例: 输入:"23" 输出:[" ...

  9. Leetcode题库——17.电话号码的字母组合

    @author: ZZQ @software: PyCharm @file: letterCombinations.py @time: 2018/10/18 18:33 要求:给定一个仅包含数字 2- ...

随机推荐

  1. JVM参数详细说明

    JVM参数详细说明   答: 下面红色部分是常用参数 -XX:CMSInitiatingPermOccupancyFraction:当永久区占用率达到这一百分比时,启动CMS回收-XX:CMSInit ...

  2. 123456123456#0#-----com.threeapp.JiQiRenDaZhan01----机器人大战恐龙

    com.threeapp.JiQiRenDaZhan01----机器人大战恐龙

  3. topK问题

    概述 在N个乱序数字中查找第K大的数字,时间复杂度可以减小至O(N). 可能存在的限制条件: 要求时间和空间消耗最小.海量数据.待排序的数据可能是浮点型等. 方法 方法一 对所有元素进行排序,之后取出 ...

  4. Hyper-V VM Generation 2 - Can not boot from .ISO (Hyper-V Gen2不能從DVD啓動 ISO)

    Q: Hyper-V VM Generation 2 - Can not  boot from .ISO (Hyper-V Gen 2不能從DVD啓動 ISO ) A: Disable secure ...

  5. 游戏协议模拟测试工具(TcpEngine)使用简介

    功能介绍 在有的网络开发需要走二进制流协议场景,比如网络游戏开发,在开发阶段,前端和后端协商好协议后就分别开发.在开发写代码的时候,有时需要对端发送一条完整的协议过来触发一下自己的代码,进行单步调试或 ...

  6. Egret入门学习日记 --- 第八篇(书中 2.0~2.6节 内容)

    第八篇(书中 2.0~2.6节 内容) 好!开始把前三章的内容录入进来. 但是!由于第一章说的内容都是在介绍白鹭引擎的背景信息,我就不在日记中写了. 直接开始从第二章写起. 2.0节 中提到了IDE( ...

  7. python set集合(16)

    在python变量中除了以前文章所提到的整形int / 浮点数float / 布尔值bool / 列表list / 字典dict 之外,还有一个类型我们还没有做详细介绍,这个变量类型就是集合set. ...

  8. 单线程与多线程的应用 --Python3

    1.单线程应用 from time import ctime, sleep from time import ctime, sleep class ThreadClass: def say(self) ...

  9. with as用法 --Python

    有些任务,可能事先设置,时候做清理工作,如下面一段程序: f = open('tmp.txt') data = f.read() print(data) 是不是忘了什么?没错,很明显忘记关闭文件句柄. ...

  10. CDH6.2的fair-scheduler.xml

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?><alloc ...