這篇文章主要介紹了C++怎么實(shí)現(xiàn)電話號(hào)碼的字母組合的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇C++怎么實(shí)現(xiàn)電話號(hào)碼的字母組合文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。
專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)長(zhǎng)汀免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了超過(guò)千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
Given a string containing digits from 2-9inclusive, return all possible letter combinations that the number could represent.
A mapping of digit to letters (just like on the telephone buttons) is given below. Note that 1 does not map to any letters.
Example:
Input: "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
Note:
Although the above answer is in lexicographical order, your answer could be in any order you want.
這道題讓我們求電話號(hào)碼的字母組合,即數(shù)字2到9中每個(gè)數(shù)字可以代表若干個(gè)字母,然后給一串?dāng)?shù)字,求出所有可能的組合。這里可以用遞歸 Recursion 來(lái)解,需要建立一個(gè)字典,用來(lái)保存每個(gè)數(shù)字所代表的字符串,然后還需要一個(gè)變量 level,記錄當(dāng)前生成的字符串的字符個(gè)數(shù),實(shí)現(xiàn)套路和上述那些題十分類似。在遞歸函數(shù)中首先判斷 level,如果跟 digits 中數(shù)字的個(gè)數(shù)相等了,將當(dāng)前的組合加入結(jié)果 res 中,然后返回。我們通過(guò) digits 中的數(shù)字到 dict 中取出字符串,然后遍歷這個(gè)取出的字符串,將每個(gè)字符都加到當(dāng)前的組合后面,并調(diào)用遞歸函數(shù)即可,參見(jiàn)代碼如下:
解法一:
class Solution { public: vectorletterCombinations(string digits) { if (digits.empty()) return {}; vector res; vector dict{"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; letterCombinationsDFS(digits, dict, 0, "", res); return res; } void letterCombinationsDFS(string& digits, vector & dict, int level, string out, vector & res) { if (level == digits.size()) {res.push_back(out); return;} string str = dict[digits[level] - "0"]; for (int i = 0; i < str.size(); ++i) { letterCombinationsDFS(digits, dict, level + 1, out + str[i], res); } } };
這道題也可以用迭代 Iterative 來(lái)解,在遍歷 digits 中所有的數(shù)字時(shí),先建立一個(gè)臨時(shí)的字符串?dāng)?shù)組t,然后跟上面解法的操作一樣,通過(guò)數(shù)字到 dict 中取出字符串 str,然后遍歷取出字符串中的所有字符,再遍歷當(dāng)前結(jié)果 res 中的每一個(gè)字符串,將字符加到后面,并加入到臨時(shí)字符串?dāng)?shù)組t中。取出的字符串 str 遍歷完成后,將臨時(shí)字符串?dāng)?shù)組賦值給結(jié)果 res,具體實(shí)現(xiàn)參見(jiàn)代碼如下:
解法二:
class Solution { public: vectorletterCombinations(string digits) { if (digits.empty()) return {}; vector res{""}; vector dict{"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; for (int i = 0; i < digits.size(); ++i) { vector t; string str = dict[digits[i] - "0"]; for (int j = 0; j < str.size(); ++j) { for (string s : res) t.push_back(s + str[j]); } res = t; } return res; } };
關(guān)于“C++怎么實(shí)現(xiàn)電話號(hào)碼的字母組合”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“C++怎么實(shí)現(xiàn)電話號(hào)碼的字母組合”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。