给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23" 输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
思路:1、先从string中提取数字:(char-'0')就能取得数字
2、0-9对应的字母按顺序存到vector中;
3、a\先取第一个数字对应的字母分别存到一个容器中(v),b\第2个数字代表的字母分别跟v的字母组合在一起(ret)。如果有第3个或者之后的数字则把ret赋给v,继续b的步骤;如果是最后一个数字,则直接返回ret,即需要求的组合。
class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> ret,vec,v;
if(digits.empty()){
return ret;
}
int i=0,j=0,total=0;
int len=digits.length();
vec.push_back(" ");
vec.push_back("1");
vec.push_back("abc");
vec.push_back("def");
vec.push_back("ghi");
vec.push_back("jkl");
vec.push_back("mno");
vec.push_back("pqrs");
vec.push_back("tuv");
vec.push_back("wxyz");
for(auto s:digits){
++total;
char c=s;
cout<<"s=="<<s<<c<<endl;
if(c>'1'&& c<'10'){
int index=c-'0';
string str="";
ret.clear();
for(j=0;j<vec[index].length();j++){
//cout<<"index="<<index<<"vec="<<vec[index]<<endl;
if(total==1)
{
str=vec[index][j];
cout<<"str=="<<str<<endl;
v.push_back(str);
if(total==len){
ret=v;
}
}else{
for(auto a:v){
str=a+vec[index][j];
//cout<<"a=="<<a<<" str =="<<str<<endl;
ret.push_back(str);
}
}
}
if(total>1 && total<len){
//v.clear();
v=ret;
}
}
}
return ret;
}
};