LeetCode刷題系列17

給定一個僅包含數字 2-9 的字符串,返回所有它能表示的字母組合。

給出數字到字母的映射如下(與電話按鍵相同)。注意 1 不對應任何字母。

 

示例:

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


來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
  • C++編程實現:

(1)遞歸方法:深度遍歷

class Solution {
public:
    vector<string> letterCombinations(string digits) {
        unordered_map<char, vector<string>> mp;
        mp['2'] = {"a","b","c"};
        mp['3'] = {"d","e","f"};
        mp['4'] = {"g","h","i"};
        mp['5'] = {"j","k","l"};
        mp['6'] = {"m","n","o"};
        mp['7'] = {"p","q","r","s"};
        mp['8'] = {"t","u","v"};
        mp['9'] = {"w","x","y","z"};
        
        int nsize = digits.size();
        if (nsize < 1)
            return {};
        vector<string> tmpstr = mp[digits[nsize-1]];
        for (int i=nsize-1; i>0; i--)
            tmpstr = combin(mp[digits[i-1]],tmpstr);
        return tmpstr;
    }
    
    vector<string> combin(vector<string> &str1, vector<string> &str2)
    {
        vector<string> retvec;
        for (int i=0; i<str1.size(); i++)
            for (int j=0; j<str2.size(); j++)
                retvec.push_back(str1[i]+str2[j]);
        return retvec;
    }
};

(2)隊列方法:廣度遍歷

方法概述:
利用數據結構中隊列的“先進先出”的知識,採用實時更新隊列的內容實現遍歷。
步驟說明:
1.建立一個map哈希表;
2.新建一個隊列;
3.將第一個字符串所對應的碼錶逐步進入到隊列中;
4.出隊操作,存儲當前出隊的string;
5.將此string與後一個字符串所對應的碼錶中每一個值相加並逐步進入到隊列中;
6.最終隊列中存儲的即爲所有情況的string
class Solution { 
public:
    vector<string> letterCombinations(string digits) {
        vector<string> res;//用於輸出向量
        map<char, string> m = { {'2',"abc" },{'3',"def"},{'4',"ghi"},{'5',"jkl"},{'6',"mno"},{'7',"pqrs"},{'8',"tuv"},{'9',"wxyz"} };//映射map哈希表
        int size = digits.size();//輸入字符串產長度
        queue<string> que;//新建隊列

        //先將第一個元素對應的碼錶入隊
        for (int j = 0; j < m[digits[0]].size(); j++)
        {
            string str;
            str.push_back(m[digits[0]][j]);//char轉string
            que.push(str);//string入隊
        }
        
        string s;//用於存儲隊頭元素
        for (int i = 1; i < size; i++)
        {
            int length = que.size();//當前隊列長度
            while (length--)
            {
                for (int j = 0; j < m[digits[i]].size(); j++)
                {
                    s = que.front();
                    s = s + m[digits[i]][j];//隊頭元素加上新元素
                    que.push(s);//入隊
                }
                que.pop();//隊頭出隊
            }
        }
        
        while (!que.empty())
        {
            res.push_back(que.front());//隊頭元素存儲至res
            que.pop();//隊頭出隊
        }
        return res;//返回
    }
};

作者:su-ge
鏈接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/solution/c-dui-lie-jian-dan-shi-xian-yi-dong-by-su-ge/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章