我现在在做一个叫《leetbook》的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看
书的地址:https://hk029.gitbooks.io/leetbook/

017. Letter Combinations of a Phone Number[M]

问题

Given a digit string, return all possible letter combinations that the number could represent.

A mapping of digit to letters (just like on the telephone buttons) is given below.

Input:Digit string “23”
Output: [“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].

分析

这题其实含义是是枚举所有可能的组合方式。如果题目要求是枚举“23”的所有可能字母组合,我们很好做,2重循环对吧?但是现在难就难在,一开始你不知道输入是什么,你没办法确定组合长度,组合个数,也没办法确定循环层数,这时候怎么办???

这里有两个思路,也是很常用的思路:递归,队列。

思路1:递归

递归一般是解决一些整体不好求的问题。它通过把大问题划小,然后找到一种特定的规律,然后求解。递归的思路我们很好理解,我们没办法确定整体,我可以先从入手。假定有个数字串“23456”
- 假定除了数字’2’外,后一串数字的组合我已经求出来了,那我只要把‘2’所代表的’abc’加到他们每一个的前面就好。所以现在只用求数字串”3456”
- 假定’3’之后一串数字的组合我已经求出来了,那我只要把‘3’所代表的’def’加到他们每一个的前面就好。所以现在只用求数字串”456”
……
- 一直这样推下去,直到发现6’后面是空的了,那返回它代表的每个字母就好了。

递归这里直接引用annafan的代码。

public class Solution {
public static List<String> letterCombinations(String digits) {
String digitletter[] = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
List<String> result = new ArrayList<String>(); if (digits.length()==0) return result; result.add("");
for (int i=0; i<digits.length(); i++)
result = combine(digitletter[digits.charAt(i)-'0'],result); return result;
} public static List<String> combine(String digit, List<String> l) {
List<String> result = new ArrayList<String>(); for (int i=0; i<digit.length(); i++)
for (String x : l)
result.add(x+digit.charAt(i)); return result;
}
}

思路2:用队列

队列的思路也不算太难理解。如果递归算纵向求解的话,队列就是横向求解。每加入一个新的数字的时候,就把当前队列的元素全都扩充一遍。使得队列不仅在长度上,也在宽度上增加了。这就像一个装配流水线。半成品每流过一个工人,工人就把之前的产品拿出来,往上安装一个零件,然后放到传送带上,让它继续传到下个工人那。

  1. 一共需要的工人数,就是数字串长度,它决定了产品需要经过几道加工
 for(int i = 0;i < digits.length(); i++)
{
}
  1. 然后我们看目前有多少个不同的半成品需要加工
 int pos = digits.charAt(i) - '0';
int size = result.size();
for(int j = 0;j < size;j++)
{
}
  1. 然后就开始加工了,我们获取每个数字对应的字符串长度,这就是工人需要加工的零件个数。这里加工是把每个半成品拿出来,复制多份,然后按上新的零件
  String tmp = result.remove();
for(int k = 0;k < map[pos].length();k++)
result.add(tmp+map[pos].charAt(k));

整体代码

public class Solution {
public List<String> letterCombinations(String digits) {
LinkedList<String> result = new LinkedList<String>();
if(digits.length() == 0)
return result;
String[] map = new String[] {"0", "1", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
result.add("");
for(int i = 0;i < digits.length(); i++)
{
int pos = digits.charAt(i) - '0';
String s = map[pos];
int size = result.size();
for(int j = 0;j < size;j++)
{
String tmp = result.poll();
for(int k = 0;k < s.length();k++)
result.add(tmp+s.charAt(k));
}
}
return result;
}
}

这里,我用了size变量来存之前加工好的半成品个数(因为队列会在加工后扩充,size会变化),

int size = result.size();
for(int j = 0;j < size;j++)

但是,高分答案中有个思路,我觉得很赞。(要是想不到这个,就用我上面的写就好了,多一行代码而已)

while(ans.peek().length()==i)

这里ans.peek().length()是取出第一个元素的长度,当长度等于i的时候,说明是当前需要加工的半成品,而加工完后,队列中的每个元素长度都会增加1,所以,这时候循环就会停止。

《LeetBook》leetcode题解(17):Letter Combinations of a Phone Number[M]的更多相关文章

  1. [LeetCode][Python]17: Letter Combinations of a Phone Number

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 17: Letter Combinations of a Phone Numb ...

  2. 【LeetCode】17. Letter Combinations of a Phone Number 电话号码的字母组合

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:电话号码, 字母组合,回溯法,题解,leetcode, ...

  3. 【一天一道LeetCode】#17. Letter Combinations of a Phone Number

    一天一道LeetCode (一)题目 Given a digit string, return all possible letter combinations that the number cou ...

  4. leetcode个人题解——#17 Letter Combinations of a Phone Number

    思路:用深搜遍历九宫格字符串,一开始做的时候发生了引用指向空地址的问题,后来发现是vector不能直接=赋值. class Solution { public: int len; ]={"a ...

  5. 【LeetCode】17. Letter Combinations of a Phone Number

    题目: 思路:设置两个List,一个存储当前层,一个存储最终层 public class Solution { public List<String> letterCombinations ...

  6. LeetCode:17. Letter Combinations of a Phone Number(Medium)

    1. 原题链接 https://leetcode.com/problems/letter-combinations-of-a-phone-number/description/ 2. 题目要求 给定一 ...

  7. Leetcode 17. Letter Combinations of a Phone Number(水)

    17. Letter Combinations of a Phone Number Medium Given a string containing digits from 2-9 inclusive ...

  8. 刷题17. Letter Combinations of a Phone Number

    一.题目说明 题目17. Letter Combinations of a Phone Number,题目给了下面一个图,输入一个字符串包括2-9,输出所有可能的字符组合. 如输入23所有可能的输出: ...

  9. [LeetCode] 17. Letter Combinations of a Phone Number 电话号码的字母组合

    Given a string containing digits from 2-9inclusive, return all possible letter combinations that the ...

随机推荐

  1. 信息管理代码分析<一>登录密码

    题解:这段代码的要求如下,输入一段字符密码(长度<=8)以二进制的形式存放在磁盘中,在输入时需要验证两次输入是否正确.第二个,登录.从磁盘中读取这个文件,然后再输入密码,看两者是否相同. 登录密 ...

  2. day01(静态、代码块、类变量和实类变量辨析 )

    静态: 关键字:static          概述: 使用static关键字修饰的成员方法.成员变量称为静态成员方法.静态成员变量.    优缺点:   优点:使用时不用创建对象,节约了空间.使得代 ...

  3. Visual C++中的ADO编程

    摘  要:本文介绍了微软推出的以ActiveX技术为基础的ADO数据存取技术,分析了ADO的工作原理,并用Visual C++说明了ADO数据访问技术的实现方法. 关键字:ADO:连接对象:OLE D ...

  4. 从窗口句柄得到菜单句柄(从HWND得到HMENU)

    1. 如果HWND是主窗口,可以使用API: GetMenu(...) 得到属于主窗口的句柄,原型如下: HMENU GetMenu(HWND hWnd); 在MFC中原型如下: CMenu* Get ...

  5. 系统目录APK更新——权限问题

    package com.example.wx; import java.io.File;import java.io.FileOutputStream;import java.io.IOExcepti ...

  6. nodejs async

    官网:https://github.com/caolan/async 流程控制:简化十种常见流程的处理集合处理:如何使用异步操作处理集合中的数据工具类:几个常用的工具类 流程控制 详细说明:http: ...

  7. 四则运算 Python实现(杨浩政,张兆敏)

    四则运算 GitHub仓库:https://github.com/15crmor/Arithmetic 项目要求: 题目:实现一个自动生成小学四则运算题目的命令行程序说明: 说明: 自然数:0, 1, ...

  8. Excel中使用VBA进行度分秒与十进制度的转换

    发现Excel的VBA功能真是批量处理的一把利刃,工作中小试牛刀了一把,将Excel中度分秒形式的坐标批量处理成十进制度形式,处理完后用于GIS展点制图. 原Excel数据如下: VBA代码如下: S ...

  9. Linux(Debian)网卡设置

    debian IP地址配置 vim /etc/network/interface   配置网卡eth0的IP地址 auto eth0 表示网卡随系统自动请 iface eth0 inet static ...

  10. NetCore入门篇:(四)Net Core项目启动文件Startup

    一.Startup介绍 1.Startup文件是Net Core应用程的启动程序,实现全局配置. 2.Net Core默认情况下,静态文件及Session都未启动,需要在Startup文件配置启动,否 ...