###### tags: `LeetCode` `Medium` `String` `Queue` # LeetCode #17 [Letter Combinations of a Phone Number](https://leetcode.com/problems/letter-combinations-of-a-phone-number/) ### (Medium) 給定一個僅包含數字 2-9 的字符串,返回所有它能表示的字母組合。答案可以按 任意順序 返回。 給出數字到字母的映射如下(與電話按鍵相同)。注意 1 不對應任何字母。 ![](https://i.imgur.com/VQB3BZI.png) --- 由於要列出所有組合, 因此可以使用Queue儲存第i位digit時的所有組合, 等讀到第i+1位digit時, 將Queue中的所有元素配上第i+1位digit所有的英文字母, 成為第i+1位digit的組合, 再將組合放回Queue中為下一位digit所用。 最後再將Queue中的元素放入vector<string>中回傳即可。 --- ``` class Solution { public: vector<string> letterCombinations(string digits) { if(!digits.size())return {}; vector<string> pad = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; queue<string> q; q.push(""); for(auto digit:digits){ for(int i=q.size();i>0;i--){ string s=q.front();q.pop(); for(auto c:pad[digit-'0']){ q.push(s+c); } } } vector<string> ans; for(int i=q.size();i>0;i--){ ans.push_back(q.front()); q.pop(); } return ans; } }; ``` --- LeetCode版, 由於上面的方法需要額外一個Queue的空間, 因此空間複雜度不太好, 這個方法透過vector swap取代Queue的push跟pop, 而在迴圈結束後用來swap的vector的空間會被釋放, 所以空間複雜度更好。 ``` class Solution { public: const vector<string> pad = { "", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" }; vector<string> letterCombinations(string digits) { if (digits.empty()) return {}; vector<string> result; result.push_back(""); for(auto digit: digits) { vector<string> tmp; for(auto candidate: pad[digit - '0']) { for(auto s: result) { tmp.push_back(s + candidate); } } result.swap(tmp);// <-tmp與result交互使用 } return result; } }; ```