在做题中学习(31):电话号码的字母组合(全排列)

2023-12-13 04:50:53

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里。


附上一部分自己画的递归展开图,方便理解。

文章来源:https://blog.csdn.net/yiren_liusong/article/details/134900041
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。