代码学习总结(一)

news2025/4/15 2:01:27

代码学习总结(一)

这个系列的博客是记录下自己学习代码的历程,有来自平台上的,有来自笔试题回忆的,主要基于 C++ 语言,包括题目内容,代码实现,思路,并会注明题目难度,保证代码运行结果

1 最长公共前缀

简单 字典树 匹配

编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。

示例输入输出 1:
输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”

示例输入输出 2:
输入:strs = [“dog”,“racecar”,“car”]
输出:“”
解释:输入不存在公共前缀。

提示:

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] 如果非空,则仅由小写英文字母组成

思路解析:

  1. 把第一个字符串作为基准,然后把它和第二个进行匹配,把二者的公共前缀取出来
  2. 把基准替换为公共前缀,分别和其他的字符串进行比较,再把新的公共替换为基准
  3. 返回最终的基准
开始
strs是否为空?
返回空字符串
设置prefix为strs_0
初始化i = 1
i < strs.size?
返回prefix
初始化j = 0
j < prefix.size 且 j < strs_i.size 且 prefix_j == strs_i_j?
j加1
截断prefix: prefix = prefix.substr_0_j
prefix是否为空?
i加1

本地 debug 代码

#include <iostream>
#include <vector>
#include <string>

using namespace std;

string longestCommonPrefix(vector<string>& strs) {
    if (strs.empty()) return "";

    // 取第一个字符串作为基准
    string prefix = strs[0];

    // 从第二个字符串开始比较
    for (int i = 1; i < strs.size(); ++i) {
        int j = 0;
        // 比较当前前缀和 strs[i] 的公共部分
        while (j < prefix.size() && j < strs[i].size() && prefix[j] == strs[i][j]) {
            ++j;
        }
        // 截断前缀
        prefix = prefix.substr(0, j);
        // 如果公共前缀为空,直接返回
        if (prefix.empty()) return "";
    }

    return prefix;
}

// 测试用例
int main() {
    vector<string> strs1 = {"flower", "flow", "flight"};
    vector<string> strs2 = {"dog", "racecar", "car"};

    cout << "示例 1 输出: " << longestCommonPrefix(strs1) << endl; // 输出: "fl"
    cout << "示例 2 输出: " << longestCommonPrefix(strs2) << endl; // 输出: ""

    return 0;
}

上述代码的运行结果为

project cover 代码运行结果1

可用于提交的代码

string longestCommonPrefix(vector<string>& strs) {
    if (strs.empty()) return "";

    // 取第一个字符串作为基准
    string prefix = strs[0];

    // 从第二个字符串开始比较
    for (int i = 1; i < strs.size(); ++i) {
        int j = 0;
        // 比较当前前缀和 strs[i] 的公共部分
        while (j < prefix.size() && j < strs[i].size() && prefix[j] == strs[i][j]) {
            ++j;
        }
        // 截断前缀
        prefix = prefix.substr(0, j);
        // 如果公共前缀为空,直接返回
        if (prefix.empty()) return "";
    }

    return prefix;
}

2 单词拆分 II

中等 字典树 单词拆分

给定一个字符串 s s s 和一个字符串字典 wordDict ,在字符串 s s s 中增加空格来构建一个句子,使得句子中所有的单词都在词典中。以任意顺序 返回所有这些可能的句子。

注意:词典中的同一个单词可能在分段中被重复使用多次。

示例输入输出 1:
输入: s = “catsanddog”, wordDict = [“cat”,“cats”,“and”,“sand”,“dog”]
输出: [“cats and dog”,“cat sand dog”]

示例 2:

输入: s = “pineapplepenapple”, wordDict = [“apple”,“pen”,“applepen”,“pine”,“pineapple”]
输出: [“pine apple pen apple”,“pineapple pen apple”,“pine applepen apple”]
解释: 注意你可以重复使用字典中的单词。

示例 3:
输入: s = “catsandog”, wordDict = [“cats”,“dog”,“sand”,“and”,“cat”]
输出 :[]

思路解析:

  1. 由于需要寻找同一个字符串在某个给定字典下所有可能的单词组合,所以最好是使用递归解决
  2. 而为了方便搜索,可以将给定字典转化为无序字典,并使用一个单独的字典用来存储已经搜索出的结果
  3. 这里的递归对象因为是一个字符串,所以可以从左开始搜索,拿到第一个成型的单词后,将右侧的部分作为新的对象,进行递归,然后把左侧的单词压入结果字典中
开始
初始化字典和记忆化搜索
调用 dfs 函数
memo 中是否存在 s?
返回 memo_s
初始化结果集 result
字典中是否存在 s?
将 s 加入 result
初始化 i = 1
i < s.size?
将 result 存入 memo_s
截取 left 和 right
字典中是否存在 left?
i 加 1
递归处理 right 部分
遍历 rightPart 结果
将 left + '' + sub 加入 result
返回 result
打印结果
结束

本地 debug 代码

#include <iostream>
#include <vector>
#include <string>
#include <unordered_set>
#include <unordered_map>

using namespace std;

class Solution {
public:
    vector<string> wordBreak(string s, vector<string>& wordDict) {
        unordered_set<string> dict(wordDict.begin(), wordDict.end()); // 初始化无序集合
        unordered_map<string, vector<string>> memo; // 初始化记忆化搜索
        return dfs(s, dict, memo);
    }

private:
    vector<string> dfs(const string& s, unordered_set<string>& dict,
                       unordered_map<string, vector<string>>& memo) {
        // 因为memo 是空的,所以如果 s 存在于这个空的变量中,它也是空的
        if (memo.count(s)) return memo[s];

        // 如果整个输入都存在于字典中,那直接返回
        vector<string> result;
        if (dict.count(s)) {
            result.push_back(s);
        }

        // 针对字符串本身进行搜索
        for (int i = 1; i < s.size(); ++i) {
            string left = s.substr(0, i); // 往左搜索,字符的左侧部分
            string right = s.substr(i); // 往右搜索,字符的右侧部分

            if (dict.count(left)) { //如果左侧部分存在于字典中
                vector<string> rightPart = dfs(right, dict, memo); // 递归对右侧部分进行处理
                for (const string& sub : rightPart) {
                    result.push_back(left + " " + sub); // 将左侧部分和右侧部分都压入到结果中
                }
            }
        }

        memo[s] = result;
        return result;
    }
};

void printResults(const std::vector<std::string>& results) {
    std::cout << "[";
    for (size_t i = 0; i < results.size(); ++i) {
        std::cout << "\"" << results[i] << "\"";
        if (i != results.size() - 1) {
            std::cout << ",";
        }
    }
    std::cout << "]" << std::endl;
}

// 测试用例
int main() {
    Solution sol;

    string s1 = "catsanddog";
    vector<string> wordDict1 = {"cat","cats","and","sand","dog"};

    string s2 = "pineapplepenapple";
    vector<string> wordDict2 = {"apple","pen","applepen","pine","pineapple"};

    string s3 = "catsandog";
    vector<string> wordDict3 = {"cats","dog","sand","and","cat"};

    vector<string> results1 = sol.wordBreak(s1, wordDict1);
    printResults(results1); // 输出: ["cats and dog","cat sand dog"]

    vector<string> results2 = sol.wordBreak(s2, wordDict2);
    printResults(results2); // 输出: ["pine apple pen apple","pineapple pen apple","pine applepen apple"]

    vector<string> results3 = sol.wordBreak(s3, wordDict3);
    printResults(results3); // 输出: []

    return 0;
}

上述代码的运行结果为

project cover 代码运行结果2

可用于提交的代码

class Solution {
public:
    vector<string> wordBreak(string s, vector<string>& wordDict) {
        unordered_set<string> dict(wordDict.begin(), wordDict.end()); // 初始化无序集合
        unordered_map<string, vector<string>> memo; // 初始化记忆化搜索
        return dfs(s, dict, memo);
    }

private:
    vector<string> dfs(const string& s, unordered_set<string>& dict,
                       unordered_map<string, vector<string>>& memo) {
        // 因为memo 是空的,所以如果 s 存在于这个空的变量中,它也是空的
        if (memo.count(s)) return memo[s];

        // 如果整个输入都存在于字典中,那直接返回
        vector<string> result;
        if (dict.count(s)) {
            result.push_back(s);
        }

        // 针对字符串本身进行搜索
        for (int i = 1; i < s.size(); ++i) {
            string left = s.substr(0, i); // 往左搜索,字符的左侧部分
            string right = s.substr(i); // 往右搜索,字符的右侧部分

            if (dict.count(left)) { //如果左侧部分存在于字典中
                vector<string> rightPart = dfs(right, dict, memo); // 递归对右侧部分进行处理
                for (const string& sub : rightPart) {
                    result.push_back(left + " " + sub); // 将左侧部分和右侧部分都压入到结果中
                }
            }
        }

        memo[s] = result;
        return result;
    }
};

void printResults(const std::vector<std::string>& results) {
    std::cout << "[";
    for (size_t i = 0; i < results.size(); ++i) {
        std::cout << "\"" << results[i] << "\"";
        if (i != results.size() - 1) {
            std::cout << ",";
        }
    }
    std::cout << "]" << std::endl;
}

这里的题目是 leetcode 中的,感兴趣的同学们可以去提交下试试,可以直接运行通过,每日二题,努力加油😉!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2334031.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第十五届蓝桥杯C/C++B组省赛真题讲解(分享去年比赛的一些真实感受)

试题A——握手问题 一、解题思路 直接用高中学的排列组合思路 二、代码示例 #include<bits/stdc.h> using namespace std; int fun(int n) {int sum0;for(int i0;i<n;i){for(int ji1;j<n;j)sum; } return sum; } int main() {cout<<fun(50)-fun(7); }三、…

【Qt】qDebug() << “中文测试“; 乱码问题

环境 Qt Creator版本&#xff1a;4.7.1 编译器&#xff1a;MSVC2015_32bit 解法一 在.pro文件中添加 msvc:QMAKE_CXXFLAGS -execution-charset:utf-8注意&#xff1a; 1、需要清理项目&#xff0c;并重新qmake&#xff0c;然后构建。 测试项目下载&#xff1a;https://do…

Vue接口平台学习六——接口列表及部分调试页面

一、实现效果图及界面布局简单梳理 整体布局分左右&#xff0c;左边调试&#xff0c;右边显示接口列表 左侧&#xff1a; 一个输入框按钮&#xff1b;下面展示信息&#xff0c;大部分使用代码编辑器就好了&#xff0c;除了请求体传文件类型需要额外处理。然后再下方显示响应信…

【C语言】预处理(下)(C语言完结篇)

一、#和## 1、#运算符 这里的#是一个运算符&#xff0c;整个运算符会将宏的参数转换为字符串字面量&#xff0c;它仅可以出现在带参数的宏的替换列表中&#xff0c;我们可以将其理解为字符串化。 我们先看下面的一段代码&#xff1a; 第二个printf中是由两个字符串组成的&am…

低频rfid手持机,助力动物耳标智能化管理

低频RFID手持机&#xff0c;助力动物耳标智能化管理&#xff0c;正逐步成为现代畜牧业不可或缺的工具。它不仅能够高效读取动物耳标中的信息&#xff0c;如唯一识别码、疫苗接种记录、健康状态等&#xff0c;还极大地提升了数据录入的准确性和时效性。 1.精准识别与追踪‌ 通过…

【从零开始学习JVM | 第三篇】虚拟机的垃圾回收学习(一)

堆空间的基本结构 Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时&#xff0c;Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收。 Java 堆是垃圾收集器管理的主要区域&#xff0c;因此也被称作 GC 堆&#xff08;Garbage Collected Heap&am…

Jieba分词的原理及应用(三)

前言 “结巴”中文分词&#xff1a;做最好的 Python 中文分词组件 上一篇文章讲了使用TF-IDF分类器范式进行企业级文本分类的案例。其中提到了中文场景不比英文场景&#xff0c;在喂给模型之前需要进行分词操作。 分词的手段有很多&#xff0c;其中最常用的手段还是Jieba库进行…

Openlayers:flat样式介绍

在前段时间我在使用WebGL矢量图层时接触到了flat样式&#xff0c;我对其十分的感兴趣&#xff0c;于是我花了几天的时间对其进行了了解&#xff0c;在这篇文章中我将简单的介绍一下flat样式的使用方式以及我对其的一些理解。 一、了解flat样式 1.什么是flat样式&#xff1f; …

149页研读——华为基于IPD全过程研发质量管理【附全文阅读】

本文介绍了IPD(集成产品开发)的全过程研发质量管理,强调了以客户需求为导向,通过跨部门协同、资源整合、快速响应等方式提高研发效率和成功率。文章详细阐述了IPD研发管理体系的精要,包括其核心思想、优势、框架以及核心理念。 其中,跨领域平台与技术研发、端到端流程与项…

Oracle 23ai Vector Search 系列之5 向量索引(Vector Indexes)

文章目录 Oracle 23ai Vector Search 系列之5 向量索引Oracle 23ai支持的向量索引类型内存中的邻居图向量索引 (In-Memory Neighbor Graph Vector Index)磁盘上的邻居分区矢量索引 (Neighbor Partition Vector Index) 创建向量索引HNSW索引IVF索引 向量索引示例参考 Windows 环…

vue模拟扑克效果

vue模拟扑克效果 效果图&#xff1a; step1:C:\Users\wangrusheng\PycharmProjects\untitled18\src\views\Home.vue <template><div class"poker-container"><!-- 使用复合数据对象实现双行显示 --><divv-for"(card, index) in POKER_…

Android12源码编译之预置Android Studio项目Android.mk文件编写

1、在AndroidManifest.xml文件中添加package"com.sprd.silentinstalldemo"属性&#xff0c;因为新版本的Android Studio默认生成的AndroidManifest.xml是没有这个属性值的 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:an…

Spring Boot 测试详解,包含maven引入依赖、测试业务层类、REST风格测试和Mock测试

Spring Boot 测试详解 1. 测试依赖引入 Spring Boot 默认通过以下 Maven 依赖引入测试工具&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</s…

leetcode刷题日记——螺旋矩阵

[ 题目描述 ]&#xff1a; [ 思路 ]&#xff1a; 题目要求按顺时针顺序给出m行n列的矩阵的数组按照题目所给的顺序挨个插入答案数组中运行如下 int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize) {*returnSize matrixSize * matrixCol…

模板引擎语法-标签

模板引擎语法-标签 文章目录 模板引擎语法-标签[toc]一、用于进行判断的{% if-elif-else-endif %}标签二、关于循环对象的{% for-endfor %}标签三、关于自动转义的{% autoescape-endautoescape %}标签四、关于循环对象的{% cycle %}标签五、关于检查值是否变化的{% ifchange %}…

深度学习学习笔记

目录 摘要 Abstracts 简介 Hourglass Module&#xff08;Hourglass 模块&#xff09; 网络结构 Intermediate Supervision&#xff08;中间监督&#xff09; 训练过程细节 评测结果 摘要 本周阅读了《Stacked Hourglass Networks for Human Pose Estimation》&#xf…

当Browser Use遇见A2A:浏览器自动化与智能体协作的“冰与火之歌“

——一场正在改写数字文明的技术奇遇 第一章 浏览器革命&#xff1a;从"手动挡"到"自动驾驶" 1.1 传统自动化工具的"中年危机" 还记得2023年那个抓狂的凌晨吗&#xff1f;你蹲守演唱会门票时&#xff0c;Selenium脚本因为验证码识别失败第108次…

(已解决)如何安装python离线包及其依赖包 2025最新

字数 305&#xff0c;阅读大约需 2 分钟 没有网络的Linux服务器上&#xff0c;如何安装完整的、离线的python包 1. 写入待安装的包 新建requirement.txt, 写入待安装的包 和 包的版本 如 flwr1.13.0 2.使用命令行直接下载 pip download -d flwr_packages -r requirements.tx…

豪越赋能消防安全管控,解锁一体化内管“安全密码”

在消防安全保障体系中&#xff0c;内部管理的高效运作是迅速、有效应对火灾及各类灾害事故的重要基础。豪越科技凭借在消防领域的深耕细作与持续创新&#xff0c;深入剖析消防体系内部管理的痛点&#xff0c;以自主研发的消防一体化安全管控平台&#xff0c;为行业发展提供了创…

拓扑排序 —— 2. 力扣刷题207. 课程表

题目链接&#xff1a;https://leetcode.cn/problems/course-schedule/description/ 题目难度&#xff1a;中等 相关标签&#xff1a;拓扑排序 / 广度优先搜搜 BFS / 深度优先搜索 DFS 2.1 问题与分析 2.1.1 原题截图 2.1.2 题目分析 首先&#xff0c;理解题目后必须马上意识到…