首页 > 其他分享 >【力扣】电话号码的组合(回溯法)

【力扣】电话号码的组合(回溯法)

时间:2024-03-07 12:34:46浏览次数:19  
标签:digits res string backtrace pos 力扣 电话号码 回溯 path

问题描述

image

class Solution {
public:
    vector<string> res;
    string path;
    // char A[26] = {'a','b','c','d','e','f','g',
    // 'h','i','j','k','l','m','n','o','p','q',
    // 'r','s','t','u','v','w','x','y','z'};
    const string letterMap[10] = {
        "", // 0
        "", // 1
        "abc", // 2
        "def", // 3
        "ghi", // 4
        "jkl", // 5
        "mno", // 6
        "pqrs", // 7
        "tuv", // 8
        "wxyz", // 9
    };
    //首先,数字字符和字母字符相对应的问题很难解决,所以需要定义一个char的二维数组来保存数字与字母的映射
    //另外,还需要把所给的字符串作为参数传入backtrace函数中,否则很难确定下一层递归的循环起点
    void backtrace(const string& digits, int pos){
        //这里的pos应该是字符串digits的下标
        //在lettermap里的下标应该是
        if(path.size() == digits.size()){
            res.push_back(path);
            return ;
        }
        int MapPos = digits[pos] - '0';
        for(int i = 0; i < letterMap[MapPos].size(); i++ ){
            path+=letterMap[MapPos][i];
            backtrace(digits, pos+1);
            path.pop_back();
        }
    }
    vector<string> letterCombinations(string digits) {
        res.clear();
        path.clear();
        if(digits.size() == 0){
            return res;
        }
        backtrace(digits, 0);
        return res;
    }
};

按照回溯的三个部分依次构建,注意区分在哪里是向下一层递归,在哪里是探索同层的下一个。
在backtrace函数中,for循环是为了穷尽一层内的所有可能,所以i的右边界应该是电话按键上某个数字对应的字母个数,而循环体里对backtrace的调用是向下一层递归。

标签:digits,res,string,backtrace,pos,力扣,电话号码,回溯,path
From: https://www.cnblogs.com/satsuki26681534/p/18058607

相关文章

  • 【力扣】求组合(回溯算法)
    题目描述2.以下是回溯算法的模版classSolution{private:vector<vector<int>>res;vector<int>path;//这个变量名还是设为path更合适voidbacktrace(intn,intk,intstartindex){//递归结束条件,这个是根据问题要求修改的if(path.s......
  • 力扣T26与T27的区别
    T27给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。T26你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一......
  • 【力扣】括号匹配(栈的应用)
    题目描述顾名思义代码如下:#include<iostream>#include<string>#include<stack>usingnamespacestd;boolisValid(strings){ if(s.empty()){ returntrue; } if(s.size()%2!=0){ returnfalse; } inti=0; stack<char>st; while(i<......
  • 力扣781.森林中的兔子
    题目:森林中有未知数量的兔子。提问其中若干只兔子"还有多少只兔子与你(指被提问的兔子)颜色相同?",将答案收集到一个整数数组answers中,其中answers[i]是第i只兔子的回答。给你数组answers,返回森林中兔子的最少数量。实现方法:由于要求兔子最少数量,可以假定答案相同的......
  • 力扣88.合并两个有序数组
    题目:给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你合并nums2到nums中,使合并后的数组同样按非递减顺序排列。注意:最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1的初始长度为m+n......
  • 力扣80.删除排序数组中的重复项 II
    题目:给你一个有序数组nums,请你删除重复出现的元素,使得出现次数超过两次的元素只出现两次,返回删除后数组的新长度。实现方法:使用map计数,用快慢指针方法,快指针不断加一,慢指针在计数小于出现次数时加一,再将快指针指向的数赋给慢指针指向的数。funcremoveDuplicates(nums......
  • 力扣118.杨辉三角
    题目:给定一个非负整数numRows,生成「杨辉三角」的前numRows行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。实现方法:从第三行开始,通过循环,依次求取上一行相邻两数的和,添加到结果里。funcgenerate(numRowsint)[][]int{ varr[][]int fori:=0;i<nu......
  • 一键采集高德地图上的电话号码
    要将高德(或腾讯、百度)地图上的号码导出到通讯录,可以按照以下步骤操作:工具:微拓客APP工具二:手机操作:手机上应用商城搜索微拓客,下载安装。微拓客下载地址https://a.app.qq.com/o/simple.jsp?pkgname=com.lieluyun.tuoke关键词客源:关键词客源按地区和行业采集地图上商家、企业信......
  • 【力扣】奇偶链表
    题目描述思路我想起了一位故人。。前面那道分隔链表的题,只需要把<x的条件改为位置的奇偶即可完全照搬过来,出题人偷懒了属于是。试着不抄代码重新写一遍:简单写了一下发现这道题不太适合用递归算法求解,因为结点在整个链表中的位置不太好确认,试着用双指针法写一下:classSolut......
  • 【力扣】反转链表II
    题目描述思路老样子,还是先用递归试试。在基本问题中,也就是left==rigth或者left+1==right时,直接将两个元素调换顺序即可。我突然发现代码随想录里好像讲过一个用双指针法反转链表的算法。那道题是把整个链表翻转,代码如下://双指针法classSolution{public:ListN......