LeetCode 17.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.

LeetCode 17.Letter Combinations of a Phone Number_第1张图片

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

你可能感兴趣的:(String,DFS)