本博客rss订阅地址: http://feed.cnblogs.com/blog/u/147990/rss

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

posted @ 2014-06-05 22:17  tenos  阅读(3717)  评论(0编辑  收藏  举报

本博客rss订阅地址: http://feed.cnblogs.com/blog/u/147990/rss

公益页面-寻找遗失儿童