Leetcode: Letter Combinations of a Phone Number

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"].

像这种DFS的题目,常见的写法无外乎两种,使用recursion, 或者用Stack。本文采用了Recursion的方式。做完后积累的经验有:像这种在一个ArrayList里面罗列可能的path的题目,recursion的参数一般包括:包含最终结果的集合(ArrayList),input(String),递归层次level(int),某一条具体的path(String)。最后这个参数虽然不是必须,但是如果使用了它,将会使recursion非常好写:所有关于这条路径的添加、删除、修改都可以以这个具体的path为操作对象,并且一旦条件满足,就可以把这个path添加到最终的结果集合里面去,用ArrayList add函数

还有一些细节需要注意:用switch函数的时候,要记得写break,否则所有的case都会执行

 1 public class Solution {

 2     public ArrayList<String> letterCombinations(String digits) {

 3         ArrayList<String> res = new ArrayList<String>();

 4         getlist(digits, res, "", 0);

 5         return res;

 6     }

 7     

 8     public void getlist(String digits, ArrayList<String> res, String single, int level) {

 9         if (digits.length() == single.length()) {

10             res.add(single);

11             return;

12         }

13         int c = (int)(digits.charAt(level) - '0'); //get the specific digit at the level unit

14         String temp = possible(c);

15         char[] letterpool = temp.toCharArray();

16         for (char st : letterpool) {

17             single += st;

18             getlist(digits, res, single, level+1);

19             single = single.substring(0, single.length() - 1);

20         }

21     }

22     

23     public String possible(int c) {

24         String letters = "";

25         switch (c) {

26             case 2: letters = "abc"; break;

27             case 3: letters = "def"; break;

28             case 4: letters = "ghi"; break;

29             case 5: letters = "jkl"; break;

30             case 6: letters = "mno"; break;

31             case 7: letters = "pqrs"; break;

32             case 8: letters = "tuv"; break;

33             case 9: letters = "wxyz"; break;

34             case 0: letters = " "; break;

35         }

36         return letters;

37     }

38 }

 另外一种做法,不用DFS和Recursion的想法,用Iteration, 稍微麻烦一点,但是也是一种方法。

 1 public class Solution {

 2     public List<String> letterCombinations(String digits) {

 3         ArrayList<String> res = new ArrayList<String>();

 4         if (digits == null) return res;

 5         if (digits.length() == 0) {

 6             res.add("");

 7             return res;

 8         }

 9         for (int i=0; i<digits.length(); i++) {

10             char c = digits.charAt(i);

11             String cr = interpret(c);

12             ArrayList<String> newres = new ArrayList<String>();

13             for (int j=0; j<cr.length(); j++) {

14                 char newelem = cr.charAt(j);

15                 if (res.size() == 0) newres.add(Character.toString(newelem));

16                 else {

17                     for (String item : res) {

18                         item = item + newelem;

19                         newres.add(item);

20                     }

21                 }

22             }

23             res = newres;

24         }

25         return res;

26     }

27     

28     public String interpret(char c) {

29         String result = "";

30         switch (c) {

31             case '2': result = "abc"; break;

32             case '3': result = "def"; break;

33             case '4': result = "ghi"; break;

34             case '5': result = "jkl"; break;

35             case '6': result = "mno"; break;

36             case '7': result = "pqrs"; break;

37             case '8': result = "tuv"; break;

38             case '9': result = "wxyz"; break;

39             default: result = "";

40         }

41         return result;

42     }

43 }

注意15行的语法问题,要将一个char类型改成String类型,用到Character.toString(char st), 另外String的‘+’连接是可以连接一个String以及char的

你可能感兴趣的:(LeetCode)