LeetCode: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递归解法

class Solution {

public:

    vector<string> letterCombinations(string digits) {

        vector<string> res;

        string tmpres(digits.size(), ' ');

        dfs(digits, 0, tmpres, res);

        return res;

    }

    

    void dfs(const string &digits, int index, string &tmpres, vector<string>&res)

    {

        string numap[] = {" ","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};

        if(index == digits.size())

        {

            res.push_back(tmpres);

            return;

        }

        for(int i = 0; i < numap[digits[index] - '0'].size(); i++)

        {

            tmpres[index] = numap[digits[index] - '0'][i];

            dfs(digits, index+1, tmpres, res);

        }

    }

};

 


 

根据编程之美-3.2电话号码对应英语单词 中的代码3-4,我们有如下的非递归解法,其实是把上述递归改为非递归

 1 class Solution {

 2 public:

 3     vector<string> letterCombinations(string digits) {

 4         vector<string>res;

 5         vector<int> ansIndex(digits.size(), 0);

 6         string numap[] = {" ","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};

 7         

 8         while(true)

 9         {

10             string tmp(digits.size(),' ');

11             for(int i = 0; i < digits.size(); i++)

12                 tmp[i] = numap[digits[i]-'0'][ansIndex[i]];

13             res.push_back(tmp);

14             int k = digits.size() - 1;

15             while(k >= 0)

16             {

17                 if(ansIndex[k] < numap[digits[k]-'0'].size() - 1)

18                 {

19                     ansIndex[k]++;

20                     break;

21                 }

22                 else 

23                 {

24                     ansIndex[k] = 0;

25                     k--;

26                 }

27             }

28             if(k < 0)break;

29         }

30         

31         return res;

32     }

33 };

 


 

bfs非递归解法(类似于求集合子集的算法2)                本文地址

class Solution {

public:

    vector<string> letterCombinations(string digits) {

        vector<string> res(1,"");

        string numap[] = {" ","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};

        for(int i = 0; i < digits.size(); i++)

        {

            vector<string>tmp;

            for(int j = 0; j < res.size(); j++)

                for(int k = 0; k < numap[digits[i] - '0'].size(); k++)

                    tmp.push_back(res[j] + numap[digits[i] - '0'][k]);

            res = tmp;

        }

        

        return res;

    }

};

 

【版权声明】转载请注明出处:http://www.cnblogs.com/TenosDoIt/p/3771254.html

你可能感兴趣的:(LeetCode)