17. 电话号码的字母组合 - 力扣(LeetCode)
思路:既然要排列组合,就得先根据数字字符取出来
所以先定义一个string类的数组通过下标取到每个数字对应的映射。
string _numsTostr[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
接下来便是:想到如果可以用递归,把每次组合的值返回(追加)到一个vector<string>对象中,且能回到上一个位置继续,就能将全排列搞定。
因为通过di下标访问数组,所以当di==digits.size()时,得到字符串,尾插到v中,返回上一级。
可以通过for循环访问每一个数字映射的全部字符。
class Solution
{
public:
string _numsTostr[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
void Combine(const string& digits,int di,string cbstr,vector<string>& v)
{
if(di==digits.size())
{
v.push_back(cbstr);
return;
}
int num = digits[di]-'0';
string str = _numsTostr[num];
for(int i=0;i<str.size();i++)
{
Combine(digits,di+1,cbstr+str[i],v);
}
}
vector<string> letterCombinations(string digits)
{
vector<string> v;
if(digits.empty())
{
return v;
}
Combine(digits,0,"",v);
return v;
}
};
注意:1.main函数加个if是因为防止用户输入为空,进到Combine里还会通过if尾插。
2.其中的参数cbstr是保存每一次最后的字符串,把他尾插到v里,而递归往下走时的每一层字符由str加到cbstr里。
3.这里传的参数v,加了引用,目的是直接加到外面要返回的v里。
附上一部分自己画的递归展开图,方便理解。