当前位置: 首页 > news >正文

力扣hot100 —— 电话号码字母组合; 子集 (非回溯做法)简单易懂

由于博主对回溯也不是很熟悉,这里提出一种简单易懂的解法(有点暴力)

解题思路:

每个数字对应有自己的字母串;

首先遍历将每个字母存入也就是 res{{a},{b},{c}}

然后遍历后续数子对应的字母,让每个字母与当前res中·元素组合然后更新进去

res{{ad},{bd},{cd},{ae},{be},{ce},{af},{bf},{cf}}

class Solution {
public:
    vector<string> base{" ", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};

    vector<string> letterCombinations(string digits) {
        // 暴力解法,逐渐添加,组合
        vector<string> res;
        if (digits.empty()) {
            return res; // 如果输入为空,直接返回空结果
        }
        res.push_back(""); // 初始化结果,加入一个空字符串
        for (auto &digit : digits) {
            int dig_num = digit - '0'; // 将字符数字转为整数
            string chars = base[dig_num - 1]; // 获取当前数字对应的字符集
            vector<string> newRes; // 用于存储新的组合
            for (auto &s : res) {
                for (auto &ch : chars) {
                    newRes.push_back(s + ch); // 将当前字符与已有组合拼接
                }
            }
            res = newRes; // 更新结果
        }
        return res;
    }
};

解法思路:与字母组合类似,只是这里不用更新结果;逐渐将每次组合加入就行

(nums = [1, 2, 3, 4], ans = [[ ]], 下标 i 从 0 开始)

1. ans = [[ ]], nums[0] = 1, 将元素1和ans内所有子集组合并添加进ans

此时:ans = [[ ], [1]];

2. ans = [[ ], [1]], nums[1] = 2, 将元素2和ans内所有子集组合并添加进ans

此时:ans = [[ ], [1], [2], [1, 2]];

3. ans = [[ ], [1], [2], [1, 2]], nums[2] = 3, 将元素3和ans内所有子集组合并添加进ans

此时:ans = [[ ], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]];

3. ans = [[ ], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]], nums[3] = 3, 将元素3和ans内所有子集组合并添加进ans

此时:ans = [[ ], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3], [4], [1, 4], [2, 4], [1, 2, 4], [3, 4], [1, 3, 4], [2, 3, 4], [1, 2, 3, 4]];

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        // 组合添加,空集也算子集
        // 遍历数字,每个数子与当前结果中的数据组合,然后添加进去
        vector<vector<int>> res;
        res.push_back({});
        for(auto &num : nums){
            vector<int> temp; // 暂存当前结果中的元素, push_back是void 类型不会直接改变
            int sub_size = res.size();
            for(int i= 0; i<sub_size;i++){ // 获取当前子集进行组合
                temp = res[i];
                temp.push_back(num);
                res.push_back(temp);
            }
        }
        return res;
    }

};



相关文章:

  • Windows安装NVIDIA显卡CUDAD调用GPU,适用于部署deepseek r1
  • halcon三维点云数据处理(二十七)remove_bin_for_3d_object_localization
  • 传统企业可观测建设之路
  • IDEA关闭SpringBoot程序后仍然占用端口的排查与解决
  • 【Linux】Ubuntu服务器的安装和配置管理
  • 在线VS离线TTS(语音合成芯片)有哪些优势-AIOT智能语音产品方案
  • Unity打包APK报错 using a newer Android Gradle plugin to use compileSdk = 35
  • 系统基础与管理(2025更新中)
  • 大语言模型中的梯度值:深入理解与应用
  • android s下make otapackage编译失败
  • Linux:互斥
  • 算法与数据结构(格雷编码)
  • Node.js 中 fs 模块的高级用法
  • 基于 Spring Boot 的高校网上缴费综合务系统设计与实现
  • C# 封装
  • WIFI的SSID超长,隐藏,重复 (2.4G和5G差异)
  • DeepSeek 提示词:基础结构
  • java给钉钉邮箱发送邮件
  • stm32仿真 74hc238流水灯 数码管动态数字显示
  • 快速入门——前端数据模拟MockJS
  • 孟夏韵评《无序的学科》丨误读与重构的文化漂流
  • 江苏省委组织部副部长高颜已任南京市委常委、组织部部长
  • 四川内江警方通报一起持刀伤人致死案:因车辆停放引起,嫌犯被抓获
  • 河南:响鼓重锤对违规吃喝问题露头就打、反复敲打、人人喊打
  • 普京批准俄方与乌克兰谈判代表团人员名单
  • 沪喀同心|为新疆青少年提供科普大餐,“小小博物家(喀什版)”启动