Leetcode之 电话号码的字母组合

题目描述

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

思路

  1. 回溯:循环与递归的嵌套
  2. 队列:首先压入第一个数字对应的字符,从第二个数字开始,将队列中的首字母逐个剔除并加上第二个数字对应的字符后加到队列尾部即可

代码

方法一:

class Solution {
public:
    vector<string> ans; // 设为全局变量,方便helper函数引用
    vector<string> sList={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; //字符表,注意不能用括号声明
    
    vector<string> letterCombinations(string digits) {
        if(digits.size()==0) return {};  // 特判
        helper(digits, {}, 0);
        return ans;
    }

    void helper(string digits, string s, int idx){
        if(idx==digits.size()){ // 回溯条件,保证digits全部被扫描
            ans.push_back(s);   // 将一种结果压入ans
            return;
        }
        else{
            // 依据digits的位数进行迭代,例如digits="234"
            // 第一层迭代为"2",将遍历对应的字符串"abc"并更新字符串,依次为"a","b","c"
            // 第二层迭代为"3",将遍历对应的字符串"def"并更新字符串,若上一层迭代为"a",则添加、更新为"ad", "ae"与"af".
            int pos=digits[idx]-'0';  // 获取idx在digits的字符,如“2”对应的2
            string tmpStr=sList[pos];  // 获取下标pos对应的字符串,如2对应的"abc"
            for(int i=0;i<tmpStr.size();i++){
                helper(digits,s+tmpStr[i],idx+1);   // 进行下一层迭代,注意同一层迭代时不改变s和idx等参数值
            }
        }
    }
};

方法二:

class Solution {
public:
    vector<string> ans;
    vector<string> sList={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; //字符表
    
    vector<string> letterCombinations(string digits) {
        if(digits.size()==0) return {};  
        queue<string> q;
        for(int i=0;i<digits.size();i++){  // 遍历digits
            int pos=digits[i]-'0'; // 数字
            string s=sList[pos]; // 数字对应字符串
            if(i==0){
                string initStr;
                for(int j=0;j<s.size();j++){
                    initStr=s[j];
                    q.push(initStr); // 填入单字符
                }
            }
            else{
                string fr=q.front();    // 队列首位
                while(fr.size()<i+1){   // 队列首位的字符串是否小于遍历digits的子串的长度
                    q.pop();            // 删除首位
                    for(int j=0;j<s.size();j++){
                        q.push(fr+s[j]);
                    }
                    fr=q.front();       // 更新队列首位
                }
            }
        }
        while(!q.empty()){
            ans.push_back(q.front());
            q.pop();
        }
        return ans;
    }
};
发布了85 篇原创文章 · 获赞 0 · 访问量 369

猜你喜欢

转载自blog.csdn.net/weixin_38312163/article/details/105078825