LeetCode OJ - Letter Combinations of a Phone Number

来源:互联网 发布:淘宝代销商如何刷销量 编辑:程序博客网 时间:2024/06/10 02:20

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.

思路一:hash表,DFS。

map<char, string> hash;DFS(s, start, item) {    if(start == s.size()) {        ret += item;        return;    }    char cur = s[start];    for(i = start; i < hash[cur].size(); i++) {        item += hash[cur][i];        DFS(s, start + 1, item);        item -= hash[cur][i];    }}


下面是AC代码,里面的测试用例输入"" 、期望输出[""],感觉没什么道理

class Solution {    map<char, string> hash;    vector<string> ret;public:    vector<string> letterCombinations(string digits) {        int len = digits.size();        if(len == 0) {            ret.push_back("");            return ret;        }        hash['0'] = "";        hash['1'] = "";        hash['2'] = "abc";        hash['3'] = "def";              hash['4'] = "ghi";        hash['5'] = "jkl";        hash['6'] = "mno";        hash['7'] = "pqrs";        hash['8'] = "tuv";        hash['9'] = "wxyz";                string item = "";        DFS(digits, 0, item);        return ret;    }        void DFS(string &digits, int start, string item) {        if(start == digits.size()) {            ret.push_back(item);            return ;        }        char cur = digits[start];        for(int i = 0; i < hash[cur].size(); i++) {            item.push_back(hash[cur][i]);            DFS(digits, start + 1, item);            item.pop_back();        }    }};

思路二:组合问题,采用迭代方式解决。维护结果集ret,对于输入digits中的第i位对应字符串X,ret必须要根据当前状况和X对每一个ret[j]增加,即ret[j] + X[k]。因此是三维迭代。注意,这里ret[j] 有一个变为X.size()个,增加了X.size() - 1个。

class Solution {public:    vector<string> letterCombinations(string digits) {          const string letters[] = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};            vector<string> ret(1, "");          for (int i = 0; i < digits.size(); ++i) {              for (int j = ret.size() - 1; j >= 0; --j) {                  const string &s = letters[digits[i] - '2'];  //取出string                for (int k = s.size() - 1; k >= 0; --k) {                      if (k)                          ret.push_back(ret[j] + s[k]);                      else                          ret[j] += s[k];                  }              }          }            return ret;      } };

此处要注意,ret.size是不断改变的,不能用来做循环判断(for j = 0 to ret.size() )

0 0