题目:
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
示例 1:
输入:digits = "23" 输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入:digits = "" 输出:[]
示例 3:
输入:digits = "2" 输出:["a","b","c"]
代码:
class Solution { public: int flag = 0; void insert(vector<string>& dest, const vector<string>& src, const string& digits, int index) { if (index == digits.size()) return; else { string tmp = src[digits[index] - '0']; int count = 0; int pos = 0; if (index == 0) { flag = dest.size() / tmp.size(); } else { flag = flag / tmp.size(); } for (size_t i = 0; i < dest.size(); i++) { if (count < flag) { dest[i].push_back(tmp[pos]); count++; } else { pos++; if (pos == tmp.size()) { pos = 0; } count = 0; i--; } } } insert(dest, src, digits, ++index); } vector<string> letterCombinations(string digits) { static vector<string> mark; mark.push_back(""); mark.push_back(""); mark.push_back("abc"); mark.push_back("def"); mark.push_back("ghi"); mark.push_back("jkl"); mark.push_back("mno"); mark.push_back("pqrs"); mark.push_back("tuv"); mark.push_back("wxyz"); vector<string> ret; if (digits == "") { // ret.push_back(""); return ret; } int count = 0; for (size_t i = 0; i < digits.size(); i++) { if (digits[i] == '7' || digits[i] == '9') count++; } ret.resize(pow(3, digits.size() - count) * pow(4, count)); insert(ret, mark, digits, 0); return ret; } };
做这种题最重要的就是找到规律,其中最重要的就是利用flag来记录每个数字所代表的字符串中每个字符分别插入到vector<string> 的哪一个位置,随着数字的变化flag发生变化,字母所插入的位置发生变化。