leetcode 17. 电话号码的字母组合

大耗子 2021年02月20日 16次浏览

题目: 17. 电话号码的字母组合

17. 电话号码的字母组合

难度中等

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

img

示例 1:

输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例 2:

输入:digits = ""
输出:[]

示例 3:

输入:digits = "2"
输出:["a","b","c"]

提示:

  • 0 <= digits.length <= 4
  • digits[i] 是范围 ['2', '9'] 的一个数字。

解题思路

使用递归的方式进行全排列。

  1. 首先将数字对应的字符串用哈希表的方式存储起来,方便取用。
  2. 对每个位置进行全排列。
  3. 只要到digits的尾部,说明字符串已经生成,放入ans中即可。

代码

class Solution {
private:
	map<char, string> phone;
public:
	vector<string> letterCombinations(string digits) {
		vector<string> ans;
		if (!digits.size()) return ans;
		initMap();
		string outString;
		// 预分配内存给string
		outString.assign(digits.size() + 1, '\0');
		letterCore(ans, digits, 0, outString);
		return ans;
	}
	// 递归的方式进行全排列
	void letterCore(vector<string> &ans, string &digits, int index, string &outString) {
		if (digits.size() <= index) {
			ans.push_back(outString); 
			return;
		}
		// 取出电话按键对应的字母串
		string tmp = phone[digits.at(index)];
		// 进行全排列
		for (int i = 0; i < tmp.size(); i++)
		{
			outString[index] = tmp[i];
			letterCore(ans, digits, index + 1, outString);
		}
	}
	void initMap() {
		phone['2'] = "abc";
		phone['3'] = "def";
		phone['4'] = "ghi";
		phone['5'] = "jkl";
		phone['6'] = "mno";
		phone['7'] = "pqrs";
		phone['8'] = "tuv";
		phone['9'] = "wxyz";
	}
};

int main()
{
	Solution sln;
	string test = "23";
	printf("%d\n", test.at(0));
	sln.letterCombinations(test);


	return 0;
}