题目:
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。。。但应该是正确的