LeetCode 17.Letter Combinations of a Phone Number (電話號碼的字母組合)
阿新 • • 發佈:2018-12-10
題目描述:
給定一個僅包含數字 2-9
的字串,返回所有它能表示的字母組合。
給出數字到字母的對映如下(與電話按鍵相同)。注意 1 不對應任何字母。
示例:
輸入:"23"
輸出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
說明: 儘管上面的答案是按字典序排列的,但是你可以任意選擇答案輸出的順序。
Accepted C++ Solution:
簡單而有效的迭代解決方案。
class Solution { public: vector<string> letterCombinations(string digits) { vector<string> result; if (digits.empty()) return vector<string>(); vector<string> v = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; result.push_back(""); //init for (int i = 0; i < digits.size(); i++) { int num = digits[i] - '0'; if (num < 0 || num > 9) break; string candidate = v[num]; if (candidate.empty()) continue; vector<string> tmp; for (int k = 0; k < result.size(); k++) { for (int j = 0 ; j < candidate.size(); j++) { tmp.push_back(result[k] + candidate[j]); } } result.swap(tmp); } return result; } };
樣本輸入“123”的說明
初始狀態:
- result = {“”}
數字“1”的第1階段:
- result有{“”}
- candiate是“abc”
- 生成三個字串“”+“a”,“”+“b”,“”+“c”並放入tmp, tmp = {“a”,“b”,“c”}
- 交換 result 和 tmp(交換不佔用記憶體副本)
- 現在 result 有{“a”,“b”,“c”}
數字“2”的第2階段:
- result有{“a”,“b”,“c”}
- candiate是“def”
- 生成九個字串並輸入tmp, “a”+“d”,“a”+“e”,“a”+“f”, “b”+“d”,“b”+“e”,“b “+”f“, ”c“+”d“,”c“+”e“,”c“+”f“
- 所以tmp有{“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”}
- 交換 result 和 tmp
- 現在result 有{“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”}
數字“3”的第3階段:
- result有{“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”}
- candiate是“ghi”
- 生成27個字串並放入tmp,
- 為“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”中的每一個新增“g”
- 為“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”中的每一個新增“h”
- 為“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”中的每一個新增“h”
- 所以,tmp有 {“adg”,“aeg”,“afg”,“bdg”,“beg”,“bfg”,“cdg”,“ceg”,“cfg” “adh”,“aeh”,“afh “,”bdh“,”beh“,”bfh“,”cdh“,”ceh“,”cfh“ ”adi“,”aei“,”afi“,”bdi“,”bei“,”bfi“,” cdi“,”cei“,”cfi“}
- 交換 result 和 tmp
- 現在result 有 {“adg”,“aeg”,“afg”,“bdg”,“beg”,“bfg”,“cdg”,“ceg”,“cfg” “adh”,“aeh”,“afh” ,“bdh”,“beh”,“bfh”,“cdh”,“ceh”,“cfh” “adi”,“aei”,“afi”,“bdi”,“bei”,“bfi”,“cdi “,”cei“,”cfi“}
最後,返回result。