leetcode: Letter Combinations of a Phone Number

http://oj.leetcode.com/problems/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.

思路

穷举法加回溯。用一个二维数组保存每个数字对应可能出现的字母,当每一层穷举完后回溯到上一层,再次穷举下个字符可能出现的组合。

 1 static char keys[8][4] = {{'a', 'b', 'c'},       // 2
 2                          {'d', 'e', 'f'},       // 3
 3                          {'g', 'h', 'i'},       // 4
 4                          {'j', 'k', 'l'},       // 5
 5                          {'m', 'n', 'o'},       // 6
 6                          {'p', 'q', 'r', 's'},  // 7
 7                          {'t', 'u', 'v'},       // 8
 8                          {'w', 'x', 'y', 'z'}}; // 9
 9 static int sizes[] = {3, 3, 3, 3, 3, 4, 3, 4}; 
10 
11 class Solution {
12 public:
13     vector<string> letterCombinations(string digits) {
14         vector<string> result;
15         int levels = digits.size(), current_level = 0;
16         vector<int> indexes(levels, 0);
17         
18         if (0 == levels) {
19             return vector<string>(1, "");
20         }
21         
22         while (true) {
23             int ch_index = digits[current_level] - '0' - 2;
24             
25             if (sizes[ch_index] == indexes[current_level]) {
26                 if (0 == current_level) {
27                     break;
28                 }
29                 
30                 indexes[current_level] = 0;
31                 --current_level;
32                 ++indexes[current_level];
33                 continue;
34             }
35             else {
36                 if (current_level < (levels - 1)) {
37                     ++current_level;
38                 }
39                 else {
40                     string s;
41                     int i;
42                     
43                     for (i = 0; i < current_level; ++i) {
44                         s.push_back(keys[digits[i] - '0' - 2][indexes[i]]);
45                     }
46                     s.push_back('?');
47                     
48                     for (i = 0; i < sizes[ch_index]; ++i) {
49                         s[current_level] = keys[ch_index][i];
50                         result.push_back(s);
51                     }
52                     
53                     indexes[current_level] = sizes[ch_index];
54                 }
55             }
56         }
57         
58         return result;
59     }
60 };

 

posted @ 2013-10-28 16:45  移山测试工作室黑灯老师  阅读(527)  评论(0编辑  收藏  举报
count website visits
Buy Computers