【Leetcode】17. 电话号码的字母组合(Letter Combinations of a Phone Number)

题目描述:

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

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

示例:

输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

分析:

用递归就可以完成,但官方把他归进了回溯法,标题就写回溯法吧~

题目中要求给定包含2-9数字的长度为N的字符串,每个数字对应几个字母,求这些所有字母的组合,如图所示。

我们可以用Map的key存储数字2-9,用value存储这个数字对应的字母(例如,2对应abc)。

递归可以很好的解决这个问题,首先从字符串的index=0开始进入,根据Map上该key对应的value值(例如key=2,value="abc"),分别取这些字母,并进入到下一个过程中。

用Map存储的过程如下:

 Map<String, String> map = new HashMap<String, 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");
}};

可以看到,答案需要一个List<String>作为返回,我们则可以:

List<String> ans = new ArrayList<>();

接下来到了写函数,我们创建一个名为dfs的函数:

public void dfs(String digits, int step, String answer) {
if (step == digits.length()) {
ans.add(answer);
return;
} char c = digits.charAt(step);
String value = map.get(c +"");
for (int i = 0; i < value.length(); i++) {
dfs(digits, step + 1, answer + value.charAt(i));
}
}

整合一下,最后AC代码为:

class Solution {
List<String> ans = new ArrayList<>();
Map<String, String> map = new HashMap<String, 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");
}};
public List<String> letterCombinations(String digits) {
if (digits.length() == 0 || digits == null)
return ans;
dfs(digits, 0, "");
return ans;
} public void dfs(String digits, int step, String answer) {
if (step == digits.length()) {
ans.add(answer);
return;
} char c = digits.charAt(step);
String value = map.get(c + "");
for (int i = 0; i < value.length(); i++) {
dfs(digits, step + 1, answer + value.charAt(i));
} }
}

最新文章

  1. SQL Server无法收缩日志文件 2 因为逻辑日志文件的总数不能少于 2问题
  2. ORACLE OLAP错误ORA-06512: at &quot;SYS.OLAPIHISTORYRETENTION&quot;
  3. java.sql.Connection解决插入数据库中文乱码问题
  4. jQuery贪吃蛇--jQuery学习
  5. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q97-Q99)
  6. Ubuntu文本编辑时vi和nano命令的区别(建议使用nano)
  7. Mac 下安装tomcat
  8. LA 3516 - Exploring Pyramids
  9. MySQL 创建库
  10. oendir(),readdir(),closedir() 打开/读取/关闭目录
  11. iOS中正则表达式的三种使用方式
  12. 整理几个js上传多张图片的效果
  13. vue+node+mongodb前后端分离博客系统
  14. (转)SqlServer2008 数据库同步:发布、订阅
  15. ExtJs 编译
  16. Python 手动新建 Scrapy项目
  17. HDU 3974 Assign the task(简单线段树)
  18. bzoj1085 骑士精神
  19. 使用javascript连接mqtt协议(自动重连问题)
  20. spring cloud连载第三篇之Spring Cloud Netflix

热门文章

  1. grafana 4 升级到 grafana 5错误处理
  2. Web Worker 多线程
  3. Go slice:切片的“陷阱”和本质
  4. python_0基础学习_day02
  5. java课堂 动手动脑2
  6. 让techempower帮你通讯服务框架的性能
  7. 1和new Number(1)有什么区别
  8. 如何编写一个WebPack的插件原理及实践
  9. Flink 源码解析 —— 源码编译运行
  10. mac下使用zerobrane调试cocos2dx的lua