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"].
Note:
Although the above answer is in lexicographical order, your answer could be in any order you want.
解题思路:直观的看,这道题非常容易,对于每个按钮进行遍历,然后枚举所有的情况,我一开始觉得非常容易,利用一个二层循环就可以遍历所有的两位数的结果。可是具体编程的时候,发现另一个问题,如果是输入的三位数、四位数是否就要三重循环或者四重甚至更高的循环,显然这样的设计是粗暴而又低效的。通过进一步分析问题,查阅资料,我发现这个问题本质上是一个DFS深度优先搜寻问题。通过深度优先找到符合条件的字符串,然后添加给数组,从而完成遍历。这里利用了一个递归的算法,通过这个题目,我们找到了一大个范围内的适合递归的算法,当有限重循环不能实现的时候,我们应该考虑递归,因为本质上递归也是一种循环。
代码如下:
public class Solution { public static void main(String[] args) { // TODO Auto-generated method stub Solution s = new Solution(); System.out.println(s.letterCombinations("22")); } String nums[]={"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; List<String> slist = new ArrayList<String>(); char []str = new char[1000]; public List<String> letterCombinations(String digits) { if(digits.length()==0)return slist; int len =digits.length(); dFS(digits,0,len); return slist; } public void dFS(String d,int i,int len){ if(i==len){ char[] temp = str; String t = new String(temp); t = t.substring(0,i); slist.add(t); return ; } int index = d.charAt(i)-'2'; for(int j=0;j<nums[index].length();j++){ str[i]=nums[index].charAt(j); dFS(d, i+1, len); } } }
一些要注意的细节就是char数组与string的转化,以及利用substring实现结束符。这里也要注意,list容器的对象类型为引用类型。
这个算法是借鉴了网上另一个算法实现的,代码如下:
string num[10]; char str[1000]; vector<string>result; void hehe(string &digits,int i,int len) { if(i==len) { str[len]='\0'; string temp=str; result.push_back(temp); return; } int index=digits[i]-'0'; for(int j=0;j<num[index].size();++j) { str[i]=num[index][j]; hehe(digits,i+1,len); } } class Solution { public: vector<string> letterCombinations(string digits) { int len=digits.size(); result.clear(); num[2]="abc"; num[3]="def"; num[4]="ghi"; num[5]="jkl"; num[6]="mno"; num[7]="pqrs"; num[8]="tuv"; num[9]="wxyz"; hehe(digits,0,len); return result; } };