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"].
Note:
Although the above answer is in lexicographical order, your answer could be in any order you want.
本题使用了深度优先遍历的思想,与之前的Permutation十分相似。
遍历过程:
DFS 在访问图中某一起始顶点 v 后,由 v 出发,访问它的任一邻接顶点 w1;再从 w1 出发,访问与 w1邻 接但还没有访问过的顶点 w2;然后再从 w2 出发,进行类似的访问,… 如此进行下去,直至到达所有的邻接顶点都被访问过的顶点 u 为止。
接着,退回一步,退到前一次刚访问过的顶点,看是否还有其它没有被访问的邻接顶点。如果有,则访问此顶点,之后再从此顶点出发,进行与前述类似的访问;如果没有,就再退回一步进行搜索。重复上述过程,直到连通图中所有顶点都被访问过为止。
在这里,回退一步十分重要,这里是让一个点尝试其他可能。
代码以及DFS思想步骤如下:
public class Solution {
public ArrayList<String> letterCombinations(String digits) {
String[] ss = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
ArrayList<String> ret = new ArrayList<String>();
rec(ret, digits.length(), ss, digits, new StringBuffer());
return ret;
}
public void rec(ArrayList<String> ret, int remain, String[] ss, String digits, StringBuffer sb){
if(remain == 0){
ret.add(sb.toString());
return;
}
String s = ss[digits.charAt(0)-'0']; //the element we need to deal with
// DFS
for(int i=0; i<s.length(); i++){
sb = sb.append(s.charAt(i));//Add new element
rec(ret, remain-1, ss, digits.substring(1), sb);//Traversal one substring
sb.deleteCharAt(sb.length()-1); //trace back for other solutions
}
}
}
我们可以看到DFS主要分为四个步骤:
1、分析是否遍历,如果是一种遍历可能就停止,输出
2、开始遍历,将新元素连接到结果串最后
3、遍历剩下的子串(一种可能)
4、删除最后一位的遍历尝试其他可能,直到所有可能(for循环)都被遍历