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;
}
};
809

被折叠的 条评论
为什么被折叠?



