Leetcode算法训练日记 | day26

文章介绍了如何使用回溯算法解决LeetCode第17题,将给定仅包含2-9数字的字符串转换为字母组合。通过递归遍历每个可能的字母组合,最后返回所有可能的结果。
摘要由CSDN通过智能技术生成

一、电话号码的字母组合

1.题目

Leetcode:第 17 题

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

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

示例 1:

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

示例 2:

输入:digits = ""
输出:[]

示例 3:

输入:digits = "2"
输出:["a","b","c"]

2.解题思路

使用回溯算法来解决数字到字母组合的问题。backtracking 函数是一个递归函数,它尝试将每个可能的字母添加到当前组合中,并递归地继续添加下一个字母,直到处理完整个输入字符串。每次递归调用时,都会检查当前组合是否已经完成(即索引是否到达字符串末尾),如果完成,则将其添加到结果集中。letterCombinations 函数是公共接口,它初始化当前组合字符串和结果集,然后开始递归过程。

3.实现代码

#include <iostream>
#include <vector>
#include <string>
using namespace std;

// 一、电话号码的字母组合
class Solution {
public:
    // 字典映射,将数字映射到对应的字母组合字符串
    const string letterMap[10] = {
        "",       // 数字0对应的字母组合
        "",       // 数字1对应的字母组合
        "abc",    // 数字2对应的字母组合
        "def",    // 数字3对应的字母组合
        "ghi",    // 数字4对应的字母组合
        "jkl",    // 数字5对应的字母组合
        "mno",    // 数字6对应的字母组合
        "pqrs",   // 数字7对应的字母组合
        "tuv",    // 数字8对应的字母组合
        "wxyz"   // 数字9对应的字母组合
    };
    vector<string> result; // 存储所有可能的字母组合的结果集
    string s;              // 用于构建当前的字母组合字符串

    // 递归函数,用于生成所有可能的字母组合
    void backtracking(const string& digits, int index) {
        if (index == digits.size()) {
            result.push_back(s); // 如果索引到达字符串末尾,将当前组合添加到结果集中
            return;              // 递归返回,不再继续扩展当前组合
        }

        int digit = digits[index] - '0'; // 将字符转换为对应的数字
        string letters = letterMap[digit]; // 获取当前数字对应的字母组合字符串
        for (int i = 0; i < letters.size(); i++) {
            s.push_back(letters[i]); // 将当前字母添加到组合字符串中
            backtracking(digits, index + 1); // 递归调用,处理下一个数字
            s.pop_back(); // 回溯,移除最后一个字母,以便尝试其他可能的字母
        }
    }

    // 主函数,用于生成给定数字字符串的所有可能的字母组合
    vector<string> letterCombinations(string digits) {
        s.clear(); // 清空当前组合字符串
        result.clear(); // 清空结果集,为新的计算做准备
        if (digits.size() == 0) {
            return result; // 如果输入字符串为空,直接返回空结果集
        }
        backtracking(digits, 0); // 调用递归函数,从第一个数字开始生成组合
        return result; // 返回所有可能的字母组合结果集
    }
};


//测试
int main()
{
    Solution s;
    vector<string> result;
    string digits="23";
    cout << " digits = " <<digits<< endl;
    result = s.letterCombinations(digits);
    cout << "所有的组合有:" << endl;
    for (auto& i : result) {
        cout << i << "  ";
    }
    cout << endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值