leetcode 17 电话号码的字母组合 (c++和python)

本文深入探讨了一种算法,该算法能够根据电话按键上的数字输入生成所有可能的字母组合。通过详细的C++和Python代码示例,展示了如何实现这一功能,特别关注于递归和迭代方法的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

题目描述:

解决思路:

C++代码:

python代码:


题目描述:

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

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

示例:

输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

解决思路:

  • 每次结合两个数字,比如输入是234,先以2开始,则ans=["a","b", "c"] ;
  • 然后2, 3结合,ans = ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]; 
  • 然后23和4结合。

C++代码:

执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户

内存消耗:6.4 MB, 在所有 C++ 提交中击败了52.85%的用户


class Solution {
public:
    vector<string> letterCombinations(string digits) {
        //
        if (digits.size() == 0) return {};

        // 仅包含数字 2-9 的字符串
        map<char, string> num_string_map;
        num_string_map.insert(pair<char, string>('2', "abc"));
        num_string_map.insert(pair<char, string>('3', "def"));
        num_string_map.insert(pair<char, string>('4', "ghi"));
        num_string_map.insert(pair<char, string>('5', "jkl"));
        num_string_map.insert(pair<char, string>('6', "mno"));
        num_string_map.insert(pair<char, string>('7', "pqrs"));
        num_string_map.insert(pair<char, string>('8', "tuv"));
        num_string_map.insert(pair<char, string>('9', "wxyz"));
        
        // 遍历字符串 "234"
        // 注意一个数字只能是对应取一个字母,从第一个数字开始依次和后面的数字结合
        // 比如23先结合,再23和4结合
        vector<string> ans;  // 赋初始值,即第一个数字所对应的所有字母.
        for (int i = 0; i < num_string_map[digits[0]].size(); i++) 
        {
            string x(1, num_string_map[digits[0]][i]);
            ans.push_back(x);
        }
        for (int i = 1; i < digits.size(); i++)  // 一次加一个,依次添加后面的数字
        {
            string cur_string = num_string_map[digits[i]];
            vector<string> tmp;  // 中间结果
            for (int j = 0; j < ans.size(); j++)  // 遍历ans中的上一次结果,依次和当前数字i对应的所有个字母结合
            {
                for (int m = 0; m < cur_string.size(); m++) tmp.push_back(ans[j] + cur_string[m]);
            }
            // 2和3结合后, tmp={"ad", "ae", "af", "bd", "be", ...}
            // 更新ans
            ans = tmp;
            // 然后继续添加后面的数字。
        }
        return ans;
    }
};

python代码:

执行用时:12 ms, 在所有 Python 提交中击败了91.38%的用户

内存消耗:13 MB, 在所有 Python 提交中击败了84.06%的用户

class Solution(object):
    def letterCombinations(self, digits):
        """
        :type digits: str
        :rtype: List[str]
        """
        # 
        if len(digits) == 0: return []

        # 哈希表,数字只有2-9
        num_string_map = {
            "2": "abc",
            "3": "def",
            "4": "ghi",
            "5": "jkl",
            "6": "mno",
            "7": "pqrs",
            "8": "tuv",
            "9": "wxyz"
        }

        # 遍历数字,依次将后面的数字与前面(ans)结合
        # 比如数字串234
        ans = []
        cur_string = num_string_map[digits[0]]
        [ans.append(cur_string[i]) for i in range(len(cur_string))]  # 初始值是["a", "b", "c"]
        for i in range(1, len(digits)):  # 依次将后面的数字与前面(ans)结合
            cur_string = num_string_map[digits[i]]  # 当前数字所对应的所有字母,需要结合到ans中
            tmp = []
            for j in range(len(ans)):  # 遍历当前的ans,依次将每一个字符串j与当前i所有的字母m结合
                for m in range(len(cur_string)):
                    tmp.append(ans[j]+cur_string[m])
            ans = tmp  # 更新ans
        
        return ans

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值