【算法与数据结构】17、LeetCode电话号码的字母组合

文章目录

所有的LeetCode题解索引,可以看这篇文章------【算法和数据结构】LeetCode题解

一、题目

二、解法

  思路分析:本题需要解决的问题有三个:

  • 一、如何实现数字到字母的映射
  • 二、如何实现组合问题
  • 三、如何解决1 *等异常情况
      数字到字母的映射有两种,一种是寻找数字和字母之间的函数关系,但这种关系并不好找,2-6分别映射了三个字母,7 9 映射了四个字母,函数关系并不明显,因此我们直接建立一个数字到字母的映射map。
cpp 复制代码
const string letterMap[10] = {
    "", // 0
    "", // 1
    "abc", // 2
    "def", // 3
    "ghi", // 4
    "jkl", // 5
    "mno", // 6
    "pqrs", // 7
    "tuv", // 8
    "wxyz" // 9
};

  第二个组合问题可以参考【算法与数据结构】77、LeetCode组合,稍做修改, 程序当中index来表示当前递归正在处理的数字的索引,终止条件为处理的索引=digits大小。同时利用ASCII码直接减去'0'得到对应的数字,并且做了异常值的处理,大于'9'小于'0'就是异常值。

  程序如下:

cpp 复制代码
class Solution {
private:
    vector<string> result;     // 结果合集
    string path;
    void backtracking(const string& digits, int index) {    // index表示当前处理的数字索引
        if (index == digits.size()) {   // 终止条件
            result.push_back(path);
            return;
        }
        if (digits[index] > '9' || digits[index] < '0') {   // 异常处理
            result.clear();
            result.push_back("input_error");
            return;
        }
        else {
            int digit = digits[index] - '0';
            string letter = letterMap[digit];
            for (int i = 0; i < letter.size(); i++) { // 剪枝优化          
                path += letter[i];  // 处理节点
                backtracking(digits, index + 1);  // 递归
                path.pop_back();    // 回溯,撤销处理的节点
            }
        }
    }
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> letterCombinations(string digits) {
        if(digits.size()) backtracking(digits, 0);           
        return result;
	}
};

复杂度分析:

  • 时间复杂度: O ( 3 m ∗ 4 n ) O(3^m*4^n) O(3m∗4n), m为映射有三个字母的数字个数,n为映射有四个字母的数字个数。
  • 空间复杂度: O ( 3 m ∗ 4 n ) O(3^m*4^n) O(3m∗4n)。

三、完整代码

cpp 复制代码
# include <iostream>
# include <vector>
# include <string>
using namespace std;

class Solution {
private:
    vector<string> result;     // 结果合集
    string path;
    void backtracking(const string& digits, int index) {    // index表示当前处理的数字索引
        if (index == digits.size()) {   // 终止条件
            result.push_back(path);
            return;
        }
        if (digits[index] > '9' || digits[index] < '0') {   // 异常处理
            result.clear();
            result.push_back("input_error");
            return;
        }
        else {
            int digit = digits[index] - '0';
            string letter = letterMap[digit];
            for (int i = 0; i < letter.size(); i++) { // 剪枝优化          
                path += letter[i];  // 处理节点
                backtracking(digits, index + 1);  // 递归
                path.pop_back();    // 回溯,撤销处理的节点
            }
        }
    }
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> letterCombinations(string digits) {
        if(digits.size()) backtracking(digits, 0);           
        return result;
	}
};

int main() {
	string digits = "*";
    Solution s1;
    vector<string> result = s1.letterCombinations(digits);
    for (vector<string>::iterator jt = result.begin(); jt != result.end(); jt++) {
        cout << *jt << " ";
    }
    cout << endl;
	system("pause");
	return 0;
}

end

相关推荐
数模竞赛Paid answer2 小时前
2026年中青杯数学建模A题数学建模论文智能评估系统与多智能体优化方法求解全过程论文及程序
算法·数学建模·中青杯
银-豆豆2 小时前
数据结构与算法-动态规划、回溯与贪心
算法·动态规划
想吃火锅10054 小时前
【leetcode】200. 岛屿数量
算法·leetcode·职场和发展
Nil2085 小时前
leetcode 54螺旋矩阵
算法·leetcode·矩阵
依然鸣5 小时前
PTA团体程序设计天梯赛L1真题讲解L1-077-080
开发语言·c++·算法·深度优先·pat考试·图论
qeen878 小时前
【数据结构】自平衡二叉搜索树各种旋转算法原理解析及AVL树的C++实现
数据结构·c++·算法
lucas_AI8 小时前
1.2B 小模型赢过 235B 大模型:NaviDC-OCR 把文档解析卷明白了
人工智能·深度学习·算法
冻柠檬飞冰走茶9 小时前
PTA基础编程题目集 7-35有理数均值(C++语言实现)
开发语言·数据结构·c++·算法·均值算法
民乐团扒谱机9 小时前
【微实验】倒谱算法(Cepstrum)深度解析:原理、数学推导与代码实现
人工智能·算法·语音识别
Nil20810 小时前
leetcode 189轮转数组
数据结构·算法·leetcode