欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

电话号码的字母组合

程序员文章站 2022-06-05 13:46:13
...

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

电话号码的字母组合

示例:

输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。


分析:

    把输入的字符串表示的数字当成N叉树来做,进行层次遍历就可以了。比如输入的是“23”,就当成如下所示的深度为2的树来做

   a             b              c

d e f        d e f         d e f

然后进行层次遍历,就得到了结果 "ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"。

但是上图所示的树并不是一个真正的树,而是一个森林,因为树只有一个根节点,所以,为了统一操作,我们给他加一个没有字符的头节点’‘,就把森林转化成了树。比如输入的还是“23”,那么就当成如下所示深度为3的树来做

                 ‘ ’

   a             b              c

d e f        d e f         d e f

进行层次遍历对应的字符,得到的结果还是 "ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"

class Solution {
public:
    vector<string> letterCombinations(string digits) {
//         当成N叉树进行层次遍历
        
//         保存结果
        vector<string> result;
        if(digits.length() <= 0) return result;
//         层次遍历的辅助队列
        queue<string> save_result;
        save_result.push("");   // 初始结果
//         进行层次遍历
        order_depth(digits,0,save_result);
//         遍历结果
        while(!save_result.empty()){
            result.push_back(save_result.front());
            save_result.pop();            
        }
        return result;
    }
    
//     层次遍历
    void order_depth(string digits, int depth, queue<string>& save_result){        
        if(depth >= digits.length()) return;    // 超过了树的深度
        
        string char_str = getStr(digits[depth]);    // 保存当前字母表示的数字
        
        int size = save_result.size();
        while(size){
            string pre_result = save_result.front();  // 得到上一层的结果
            save_result.pop();  // 弹出
    //         保存这一层的结果
            for(int i=0; i<char_str.length(); i++){
                save_result.push(pre_result + char_str[i]);
            }
            size --;
        }
//         下一层
        order_depth(digits, depth+1, save_result);
    }
    
//     获得相应的字母表示的string
    string getStr(char ch){
        switch(ch){
            case '2':return "abc";
            case '3':return "def";
            case '4':return "ghi";
            case '5':return "jkl";
            case '6':return "mno";
            case '7':return "pqrs";
            case '8':return "tuv";
            case '9':return "wxyz";
        }
        return "";
    }
};

 

相关标签: leetcode C++