给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23" 输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
解法一:
思路:先将数字串转换成对应的字符串数组,然后将第一个数字对应的字符串转换成string数组,然后利用fun函数将它与下一个数字对应的字符串结合返回一个新的string数组……以此类推,直到得到最终的结果。
class Solution { public: vector<string> fun(vector<string> vec,string s){//函数功能:将一个字符串数组和一个字符串结合,结果返回一个字符串数组 vector<string> v; for(int i=0;i<vec.size();++i){ for(int j=0;j<s.size();++j){ v.push_back(vec[i]+s[j]); } } return v; } vector<string> letterCombinations(string digits) { vector<string> vec; if(digits=="") return vec; int len=digits.size(); string str[len]; for(int i=0;i<len;++i){//将单个数字转换成相应的字符串 switch(digits[i]){ case '2':{ str[i]="abc"; break; } case '3':{ str[i]="def"; break; } case '4':{ str[i]="ghi"; break; } case '5':{ str[i]="jkl"; break; } case '6':{ str[i]="mno"; break; } case '7':{ str[i]="pqrs"; break; } case '8':{ str[i]="tuv"; break; } case '9':{ str[i]="wxyz"; break; } } } for(int i=0;i<str[0].size();++i){//将第一个字符串转换成字符串数组,这样就可以循环利用fun求解了 string s; vec.push_back(s+str[0][i]); } for(int i=1;i<len;++i){//循环求解 vec=fun(vec,str[i]); } return vec; } };
解法二(大婶解):
class Solution {//mo拜 private: vector<string> res; vector<string> phone = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; public: vector<string> letterCombinations(string digits) { if(digits.size() == 0) return res; dfs(digits,0,""); return res; } void dfs(string& digits,int idx,string tmp){ if(idx == digits.size()){ res.push_back(tmp); return; } for(int i = 0;i < phone[digits[idx] - '0'].size();++i){ dfs(digits,idx + 1,tmp + phone[digits[idx] - '0'][i]); } } };