17. Letter Combinations of a Phone Number

Total Accepted: 78428  Total Submissions: 273021  Difficulty: Medium

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.

Subscribe to see which companies asked this question

Hide Tags
  Backtracking String
Hide Similar Problems
  (M) Generate Parentheses (M) Combination Sum

分析:

比较典型的回溯法例子,和subset, combination等问题一样的backtracking。总是在指定的长度的digits中对应数字位置的字符串(在basestr字符串数组中的位置)进行递归,一旦找到答案就回溯!

本题联动:

<LeetCode OJ> 216. Combination Sum III

<LeetCode OJ> 77. Combinations

<LeetCode OJ> 78 / 90 Subsets (I / II)

唯一的区别是要先建立一个从数字到字母的转换表。这样每一层递归遍历当前digits[i](是一个数字,表示在字母的转换表中的位置)所对应的字符串,并加入当前combination中传到下一层递归。

class Solution {
public:
	void dfs(string &subans, string basestr[], int start)//使用引用,有利于防止内存大爆炸  
	{
		if (subans.size() == digit.size())//已经获得指定长度的答案,则回溯  
		{
			result.push_back(subans);
			return;//回溯  
		}
		for (int i = 0; i < basestr[digit[start]-'0'].size(); i++)//对指定字符数字位置的字符串进行回溯。
		{
			subans.push_back(basestr[digit[start] - '0'][i]);
			dfs(subans, basestr, start + 1);
			subans.pop_back(); // 回溯完成后去掉末尾元素,准备下一轮回溯法找答案  
		}
	}
	vector<string> letterCombinations(string digits) {
	    if(digits.empty())
	        return result;
		digit = digits;
		string basestr[10] = { "#", "#", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" };
		string str;
		dfs(str, basestr, 0);
		return result;
	}
private:
	vector<string> result;
	string digit;
};


完整代码:

#include<iostream>  
#include<sstream>        //istringstream 必须包含这个头文件
#include<string>  
#include "vector"

using namespace std;

class Solution {
public:
	void dfs(string &subans, string basestr[], int start)//使用引用,有利于防止内存大爆炸  
	{
		if (subans.size() == digit.size())//已经获得答案,并且回溯  
		{
			result.push_back(subans);
			return;//回溯  
		}
		for (int i = 0; i < basestr[digit[start]-'0'].size(); i++)
		{
			subans.push_back(basestr[digit[start] - '0'][i]);
			dfs(subans, basestr, start + 1);
			subans.pop_back(); // 回溯完成后去掉末尾元素,准备下一轮回溯法找答案  
		}
	}
	vector<string> letterCombinations(string digits) {
		digit = digits;
		string basestr[10] = { "#", "#", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" };
		string str;
		dfs(str, basestr, 0);
		return result;
	}
private:
	vector<string> result;
	string digit;
};

int main()
{
	Solution s;
	string str("23");
	vector<string> vec = s.letterCombinations(str);
	system("pause");
	return 0;
}



注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!

原文地址:http://blog.csdn.net/ebowtang/article/details/51287309

原作者博客:http://blog.csdn.net/ebowtang

本博客LeetCode题解索引:http://blog.csdn.net/ebowtang/article/details/50668895

你可能感兴趣的:(LeetCode,C++,技术,搜索,回溯法)