LeetCode 17.Letter Combinations of a Phone Number

来源:互联网 发布:安卓扫雷源码 编辑:程序博客网 时间:2024/06/04 23:33

题目:

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"].
分析与解答:

题目不难,主要是利用递归的DFS。把手机键盘保存在一个map<char,string>中,对digits进行递归,找到其每一位在map中对于的string即可,如下:

class Solution {private:    vector<string> result;    map<char, string> letterSet;public:void createLetterSet() {letterSet.clear();letterSet['1'] = "";letterSet['2'] = "abc";letterSet['3'] = "def";letterSet['4'] = "ghi";letterSet['5'] = "jkl";letterSet['6'] = "mno";letterSet['7'] = "pqrs";letterSet['8'] = "tuv";letterSet['9'] = "wxyz";}vector<string> letterCombinations(string digits) {result.clear();createLetterSet();dfs(0, digits, "");return result;}void dfs(int depth, string &digits, string ans) {if (depth == digits.size()) {result.push_back(ans);return;}for (int i = 0; i < letterSet[digits[depth]].size(); i++) {dfs(depth + 1, digits, ans + letterSet[digits[depth]][i]);}}};

当然了,有时候题会说禁止用递归,那就用一个DFS的非递归版本,写起来难度比递归的大一些,如下,:

class Solution1 {private:vector<string> result;map<char, string> letterSet;public:void createLetterSet() {letterSet.clear();letterSet['1'] = "";letterSet['2'] = "abc";letterSet['3'] = "def";letterSet['4'] = "ghi";letterSet['5'] = "jkl";letterSet['6'] = "mno";letterSet['7'] = "pqrs";letterSet['8'] = "tuv";letterSet['9'] = "wxyz";}vector<string> letterCombinations(string digits) {result.clear();if (!digits.size()) {result.push_back("");return result;}const int size = digits.size();createLetterSet();vector<int> numbers(size);/*int *numbers = new int[size];memset(numbers, 0, sizeof(int) * size);*/int k = size - 1;while (k >= 0) {k = size - 1;string tempStr(size, '0');for (int i = 0; i < size; i++) {tempStr[i] = letterSet[digits[i]][numbers[i]];}result.push_back(tempStr);while (k >= 0) {if (numbers[k] < letterSet[digits[k]].size()) {numbers[k]++;break;} else {k--;numbers[k] = 0;}}}delete[] numbers;return result;}};
不过这个方法出现了MLE。。。但应该是正确的

0 0
原创粉丝点击