LeetCode 17 Letter Combinations of a Phone Number 递归与DFS的使用

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.

LeetCode 17 Letter Combinations of a Phone Number 递归与DFS的使用_第1张图片

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


你可能感兴趣的:(LeetCode 17 Letter Combinations of a Phone Number 递归与DFS的使用)