十大男装私人定制品牌,seo值怎么提高,如何做好品牌网站建设策划,商城模板htmlLeetCode 面试经典 150_回溯_电话号码的字母组合#xff08;98_17_C_中等#xff09;题目描述#xff1a;输入输出样例#xff1a;题解#xff1a;解题思路#xff1a;思路一#xff08;递归#xff08;回溯#xff09;#xff09;#xff1a;代码实现代码实现…LeetCode 面试经典 150_回溯_电话号码的字母组合98_17_C_中等题目描述输入输出样例题解解题思路思路一递归回溯代码实现代码实现思路一递归回溯以思路一为例进行调试部分代码解读题目描述给定一个仅包含数字 2-9 的字符串返回所有它能表示的字母组合。答案可以按任意顺序返回。给出数字到字母的映射如下与电话按键相同。注意 1 不对应任何字母。输入输出样例示例 1输入digits “23”输出[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]示例 2输入digits “”输出[]示例 3输入digits “2”输出[“a”,“b”,“c”]提示0 digits.length 4digits[i] 是范围 [‘2’, ‘9’] 的一个数字。题解解题思路思路一递归回溯1、本题其实就是我们日常打字中使用九键拼音通过9个按键不同的组合形成不同的字母组合。假设第一次按的是 1 键则从 [a,b,c] 中选取一个字母第二次按的是 7 键则从 [p,q,r,s] 中选取一个字母以此类推。最后将选出的字母按照顺序依次进行组合就是电话号码的字母组合。为了能快速的得到数字与字母的对应关系我们需将其关系存入哈希表。不定次数的多重循环转换为递归问题2、复杂度分析① 时间复杂度O(3m*4n)其中 m 是输入中对应 3 个字母的数字个数包括数字 2、3、4、5、6、8n 是输入中对应 4 个字母的数字个数包括数字 7、9mn 是输入数字的总个数(可转换为多重循环问题进行理解)。② 空间复杂度O(mn)递归需要 mn空间每层挑选一个字母哈希表为固定的常熟O(1)。代码实现代码实现思路一递归回溯classSolution{private://存储号码与字母的对应关系unordered_mapchar,stringmap;//记录一种电话号码的字母组合vectorcharpath;//存储所有的电话号码字母组合vectorstringans;//创建号码与字母的对应关系voidcreateMap(){map[2]abc;map[3]def;map[4]ghi;map[5]jkl;map[6]mno;map[7]pqrs;map[8]tuv;map[9]wxyz;}voidbacktracking(string digits,intn){//当一个组合中字母数量达到要求是存储到ans中if(path.size()digits.size()){//将char类型的path进行拼接装入ansans.emplace_back(string(path.begin(),path.end()));return;}//str代表当前号码对应的字母string strmap[digits[n]];for(inti0;istr.size();i){//将字母存入path中path.emplace_back(str[i]);//挑选下一个号码对应的字母backtracking(digits,n1);//回溯path.pop_back();}}public:vectorstringletterCombinations(string digits){//清空ans和path防止上次调用残留数据ans.clear();path.clear();//如果未输入号码则返回 []if(digits)returnans;//创建号码与字母的对应关系createMap();//电话号码的字母组合backtracking(digits,0);returnans;}};以思路一为例进行调试#includeiostream#includevector#includeunordered_mapusingnamespacestd;classSolution{private://存储数字与字母的对应关系unordered_mapchar,stringmap;//记录一种电话号码的字母组合vectorcharpath;//存储所有的电话号码字母组合vectorstringans;//创建数字与字母的对应关系voidcreateMap(){map[2]abc;map[3]def;map[4]ghi;map[5]jkl;map[6]mno;map[7]pqrs;map[8]tuv;map[9]wxyz;}voidbacktracking(string digits,intn){//当一个组合中字母数量达到要求是存储到ans中if(path.size()digits.size()){//将char类型的path进行拼接装入ansans.emplace_back(string(path.begin(),path.end()));return;}//str代表当前号码对应的字母string strmap[digits[n]];for(inti0;istr.size();i){//将字母存入path中path.emplace_back(str[i]);//挑选下一个号码对应的字母backtracking(digits,n1);//回溯path.pop_back();}}public:vectorstringletterCombinations(string digits){//清空ans防止上次调用残留数据ans.clear();//如果未输入号码则返回 []if(digits)returnans;//创建号码与字母的对应关系createMap();//电话号码的字母组合backtracking(digits,0);returnans;}};intmain(intargc,charconst*argv[]){string digits23;//电话号码的字母组合Solution s;vectorstringanss.letterCombinations(digits);//输出电话号码的字母组合for(constautoi:ans){couti ;}return0;}部分代码解读string(path.begin(),path.end())vectorcharpath;string(path.begin(),path.end())这个方法通常用于将其他容器例如 std::vector 或 std::deque转换为 std::string。它将指定范围内的字符拷贝到新的 std::string 中。LeetCode 面试经典 150_回溯_电话号码的字母组合98_17)原题链接欢迎大家和我沟通交流(✿◠‿◠)