LeetCode(17) - Letter Combinations of a Phone Number

  经典的backtracking(回溯算法)的题目。当一个题目,存在各种满足条件的组合,并且需要把它们全部列出来时,就可以考虑backtracking了。当然,backtracking在一定程度上属于穷举,所以当数据特别大的时候,不合适。而对于那些题目,可能就需要通过动态规划来完成。

  这道题的思路很简单,假设输入的是"23",2对应的是"abc",3对应的是"edf",那么我们在递归时,先确定2对应的其中一个字母(假设是a),然后进入下一层,穷举3对应的所有字母,并组合起来("ae","ad","af"),当"edf"穷举完后,返回上一层,更新字母b,再重新进入下一层。这个就是backtracing的基本思想。

  代码如下:

 1 public class Solution {
 2     public List<String> letterCombinations(String digits) {
 3         //把table上的数字对应的字母列出来,当输入为2是,digits[2]就是2所对应的"abc"
 4         String[] table = new String[] 
 5                              {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
 6         List<String> list = new ArrayList<String>();
 7         //index从0开始,即digits的第一个数字
 8         letterCombinations(list,digits,"",0,table);
 9         return list;
10     }
11     
12     private void letterCombinations (List<String> list, String digits, 
13                                     String curr, int index,String[] table) {
14         //最后一层退出条件
15         if (index == digits.length()) {
16             if(curr.length() != 0) list.add(curr);
17             return;
18         }
19         
20         //找到数字对应的字符串
21         String temp = table[digits.charAt(index) - '0'];
22         for (int i = 0; i < temp.length(); i++) {
23             //每次循环把不同字符串加到当前curr之后
24             String next = curr + temp.charAt(i);
25             //进入下一层
26             letterCombinations(list,digits,next,index+1,table);
27         }
28     }
29 }
原文地址:https://www.cnblogs.com/kepuCS/p/5271654.html