Leetcode 17. 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"].

题目大意:根据数字得到的所有可能的字符串

方法一(迭代):用模拟的方法,可以联想一下我们用旧手机输入英文是怎么输入的,假设前面有一段已结输入好的串,我们这时要输入 按键2 上的字母则一共可能有 三种情况  分别是"...a","...b","...c",我们只需要在原有的基础上加上一个字符就行了。这时很容易想到用迭代的方法解题,我们把前n-1个字母所有可能的情况,都拿出来在后面加上第n个字母就行了

代码如下:

class Solution {
public:
    vector<string> letterCombinations(string digits) {
        
        vector<string> ans;
        string str;
        if(digits.empty())
            return ans;
            
        vector<string> strs(10);
        strs[2]="abc";
        strs[3]="def";
        strs[4]="ghi";
        strs[5]="jkl";
        strs[6]="mno";
        strs[7]="pqrs";
        strs[8]="tuv";
        strs[9]="wxyz";
        
       
        ans.push_back("");//初始化0个数字可能的情况
        
        for(int i=0;i<digits.size();i++){
            int len=ans.size();
            for(int j=0;j<len;j++){
                str=ans[0];
                ans.erase(ans.begin());
                for(int k=0;k<strs[digits[i]-'0'].size();k++){
                    ans.push_back(str+strs[digits[i]-'0'][k]);
                }
            }
        }
        return ans;
    }
};

方法二(回溯):我们可以看成是一个树的深度遍历,非递归代码没有研究出来,若有大神写出来了能否发个链接,毕竟通常非递归效率较高。

递归代码如下:

class Solution {
public:
    vector<string> letterCombinations(string digits) {
        
        vector<string> ans;
        string str;
        if(digits.empty())
            return ans;
            
        map<char,string> letter;
        letter['0']="";
        letter['1']="";
        letter['2']="abc";
        letter['3']="def";
        letter['4']="ghi";
        letter['5']="jkl";
        letter['6']="mno";
        letter['7']="pqrs";
        letter['8']="tuv";
        letter['9']="wxyz";
        
        DFS(digits,letter,ans,str,0);
        return ans;
    }

private:   
    void DFS(string digits,map<char,string> letter,vector<string> &ans,string str,int step){
        if(step>=digits.size()){
            ans.push_back(str);
            return;
        }else{
            for(int i=0;i<letter[digits[step]].size();i++){
                DFS(digits,letter,ans,str+letter[digits[step]][i],step+1);
            }   
        }
    }
};


你可能感兴趣的:(LeetCode,C++,回溯)