题目:
给定一个仅包含数字 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发生变化,字母所插入的位置发生变化。
该博客介绍了如何使用C++解决LeetCode上的第17题,即根据数字字符串生成可能的字母组合。通过解析电话按键对应的字母映射,利用递归方法生成所有可能的组合。示例和代码展示了解题思路,重点在于利用标志变量(flag)跟踪每个数字对应字母在结果字符串中的插入位置。
829

被折叠的 条评论
为什么被折叠?



