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

力扣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;
    }

};




http://www.kler.cn/a/562490.html

相关文章:

  • ctfshow做题笔记—栈溢出—pwn57~pwn60
  • 基数排序:独特的排序之道
  • C++和OpenGL实现3D游戏编程【连载23】——几何着色器和法线可视化
  • Vue3 + Vite + TS,使用 配置项目别名属性:resolve
  • 补题A-E Codeforces Round 953 (Div. 2)
  • 【Java】数据类型
  • Vue中环境配置的若干问题解决
  • opencv边缘检测
  • mysql大数量表添加索引方案
  • 《AI 大模型 ChatGPT 的传奇》
  • uni-app 开发 App 、 H5 横屏签名(基于lime-signature)
  • 优选算法大集合(待更新)
  • Python 3.11 69 个内置函数(完整版)
  • 《Keras 3 使用 PointNet 进行点云分段》:此文为AI自动翻译
  • ktransformers 上的 DeepSeek-R1 671B open-webui
  • 7种内外网数据交换方案全解析 哪种安全、高效、合规?
  • LLM之论文阅读——Context Size对RAG的影响
  • pip太慢了怎么办 换源下载
  • 倚光科技:助力玻璃非球面的打样与小批量生产
  • 【uniapp】上传文件流图片