在做题中学习(31):电话号码的字母组合(全排列)
2023-12-13 04:50:53
思路:既然要排列组合,就得先根据数字字符取出来
所以先定义一个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里。
附上一部分自己画的递归展开图,方便理解。
文章来源:https://blog.csdn.net/yiren_liusong/article/details/134900041
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!