题目描述:
给出一个仅包含数字的字符串,给出所有可能的字母组合。 数字到字母的映射方式如下:(就像电话上数字和字母的映射一样) 注意:虽然上述答案是按字典序排列的,但你的答案可以按任意的顺序给出
解题思路: 由题述可知,输入是给定一个由数字组成的字符串,每个数字对应电话上的字符串,要求输出所有可能的字母组合。 首先会考虑由给定的输入可以得到每个数字对应的字符串,剩下的工作就是如何得到这些字符串的排列组合:常规的思路就是首先固定第一个数字对应的第一个字符,然后一次与剩余字母对应的字符串组合,但这样会用好多for循环,代码效率不高。
以下代码的思路为:先得到第一个数字所对应的字符串,放入字符串数组,然后将该字符串数组中的每个字符串,与第二个数字所对应字符串的每个字符组合得到新的字符串数组,然后将该新的字符串数组中的每个字符串再与第三个数字所对应字符串中的每个字符组合,所有操作均按此步骤循环。
class Solution { public: /** * * @param digits string字符串 * @return string字符串vector */ vector<string> letterCombinations(string digits) { vector<string>ans(1,""); map<char, string>m; //vector<string>tmp; int len=digits.size(); m={{'2',"abc"},{'3',"def"},{'4',"ghi"},{'5',"jkl"}, {'6',"mno"},{'7',"pqrs"},{'8',"tuv"},{'9',"wxyz"},{'0'," "}}; for(int i=0;i<len;i++){ vector<string>tmp; for(int j=0;j<ans.size();j++){ for(int k=0;k<m[digits[i]].size();k++){ tmp.push_back(ans[j]+m[digits[i]][k]); } } ans=tmp; } return ans; } };看代码讨论区,还有一些同学是用的回归的想法,供参考(我自己还不太会用递归):
链接:https://www.nowcoder.com/questionTerminal/5044a44afe6c40ec9b67b7531393e854?f=discussion 来源:牛客网 class Solution { private: map<char,string> mp={{'2',"abc"},{'3',"def"},{'4',"ghi"},{'5',"jkl"},{'6',"mno"},{'7',"pqrs"},{'8',"tuv"},{'9',"wxyz"}}; vector<string> res; string temp; public: void combine(string &digits,int start){//回溯法 if(start==digits.size()){ res.push_back(temp);return; } for(int i=0;i<mp[digits[start]].size();i++){ temp+=mp[digits[start]][i]; combine(digits,start+1); temp.pop_back(); } } vector<string> letterCombinations(string digits) { combine(digits,0); return res; } };【物来顺应】