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

来源:互联网 发布:java中的log怎么用 编辑:程序博客网 时间:2024/05/19 19:40

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


0 0
原创粉丝点击