LeetCode電話號碼的字母組合題(C++/Python)
阿新 • • 發佈:2021-01-12
題目
給定一個僅包含數字2-9的字串,返回所有它能表示的字母組合。
給出數字到字母的對映如下(與電話按鍵相同)。注意 1 不對應任何字母。
┌─────┬─────┬─────┐ │ 1 │ 2 │ 3 │ │ !@# │ abc │ def │ ├─────┼─────┼─────┤ │ 4 │ 5 │ 6 │ │ ghi │ jkl │ mno │ ├─────┼─────┼─────┤ │ 7 │ 8 │ 9 │ │ pqrs│ tuv │ wxyz│ ├─────┼─────┼─────┤ │ * │ 0 │ # │ │ + │ - │ │ └─────┴─────┴─────┘
示例:
輸入:"23"
輸出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
說明:
儘管上面的答案是按字典序排列的,但是你可以任意選擇答案輸出的順序。
難點
本題難點在於事先無法確定輸入字串的長度,傳統多層遍歷難以實現。
高票答案
Python
既然每個狀態只和上一狀態有關,只需要用ans記錄一個狀態就好了,一直更新ans
作者:SoraYuki
class Solution: def letterCombinations(self, digits: str) -> list: KEY = {'2': ['a', 'b', 'c'], '3': ['d', 'e', 'f'], '4': ['g', 'h', 'i'], '5': ['j', 'k', 'l'], '6': ['m', 'n', 'o'], '7': ['p', 'q', 'r', 's'], '8': ['t', 'u', 'v'], '9': ['w', 'x', 'y', 'z']} if digits == '': return [] ans = [''] for num in digits: ans = [pre + suf for pre in ans for suf in KEY[num]] return ans
鑑於python的特性,字典寫成{'2' : 'abc' , 3 : 'def'}
形式也是可以的,只是沒有那麼直觀。
C++
使用遞迴不斷取子串,長度歸零時push_back輸出,輸出後刪除本次append
作者:蘅蕪君
#include <iostream> #include <string> #include <vector> #include <map> using namespace std; void DFS(string digit); map<char,string> mp = { {'2',"abc"},{'3',"def"},{'4',"ghi"},{'5',"jkl"}, {'6',"mno"},{'7',"pqrs"},{'8',"tuv"},{'9',"wxyz"} }; vector<string> res; string cur; vector<string> letterCombinations(string digits){ if(!digits.size()) return res; DFS(digits); return res; } void DFS(string digit) { if(!digit.size()) res.push_back(cur); else { char num = digit[0]; string letter = mp[num]; for(int i = 0;i < letter.size();i++) { cur.push_back(letter[i]); DFS(digit.substr(1)); cur.pop_back(); } } } int main(int argc, char const *argv[]) { string str="23"; for (auto i: letterCombinations(str)) { cout<<i<<endl; } return 0; }
原文
https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number