第四章 字符串

news2024/9/22 6:47:00

目录

  • 一、反转字符串
  • 二、反转字符串 II
  • 三、替换空格
  • 四、反转字符串中的单词
  • 五、左旋转字符串
  • 六、找出字符串中第一个匹配项的下标(KMP算法实现)
  • 七、重复的子字符串

一、反转字符串

Leetcode 344

class Solution {
public:
    void reverseString(vector<char>& s) {
        for (int i = 0; i < s.size() / 2; i ++ )
            swap(s[i], s[s.size() - 1 - i]);
    }
};

二、反转字符串 II

Leetcode 541

使用库函数 reverse()

class Solution {
public:
    string reverseStr(string s, int k) {
        for (int i = 0; i < s.size(); i += (2 * k)) {
            if (i + k <= s.size())
                reverse(s.begin() + i, s.begin() + i + k);
            else reverse(s.begin() + i, s.end());
        }
        return s;
    }
};

三、替换空格

剑指 Offer 05

为了将时间复杂度做到 O ( n ) O(n) O(n),空间复杂度做到 O ( 1 ) O(1) O(1),可以先统计字符串中空格的个数,然后将字符串长度扩充到替换后的字符串的长度。接下来,采用双指针从后往前遍历, i i i 指向新长度的末尾, j j j 指向旧长度的末尾,遇到空格就替换掉。

class Solution {
public:
    string replaceSpace(string s) {
        int cnt = 0, len_old = s.size();
        for (char c: s) // 统计空格个数
            if (c == ' ') cnt ++ ;
        s.resize(len_old + cnt * 2);
        int len_new = s.size();
        for (int i = len_new - 1, j = len_old - 1; j < i; i -- , j -- ) 
            if (s[j] != ' ') s[i] = s[j];
            else {
                s[i] = '0', s[i - 1] = '2', s[i - 2] = '%';
                i -= 2;
            }
        return s;
    }
};

四、反转字符串中的单词

Leetcode 151

  • 先去掉多余空格(快慢指针)
  • 翻转整个字符串
  • 翻转每个单词
class Solution {
public:
    void reverse(string& s, int start, int end) {
        for (int i = start, j = end; i < j; i ++ , j -- )
            swap(s[i], s[j]);
    }

    void removeExtraSpace(string& s) {
        int slow = 0;
        for (int i = 0; i < s.size(); i ++ )
            if (s[i] != ' ') {
                if (slow != 0) s[slow ++ ] = ' '; // 给单词之间添加空格
                while (i < s.size() && s[i] != ' ') s[slow ++ ] = s[i ++ ]; // 补充完整单词
            }
        s.resize(slow);
    }

    string reverseWords(string s) {
        removeExtraSpace(s);
        reverse(s, 0, s.size() - 1);
        int start = 0;
        for (int i = 0; i <= s.size(); i ++ )
            if (i == s.size() || s[i] == ' ') {
                reverse(s, start, i - 1);
                start = i + 1;
            }
        return s;
    }
};

五、左旋转字符串

剑指 Offer 58 -Ⅱ

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        reverse(s.begin(), s.begin() + n);
        reverse(s.begin() + n, s.end());
        reverse(s.begin(), s.end());
        return s;
    }
};

六、找出字符串中第一个匹配项的下标(KMP算法实现)

Leetcode 28

详细 KMP 算法解释见参考文章

看文章时应该注意几点:

  • 前后缀数组的含义,注意理解图中这句话在这里插入图片描述
  • next 数组与前后缀数组的联系
class Solution {
public:
    void getNext(int *next, const string& s) {
        next[0] = 0;
        for (int i = 1, j = 0; i < s.size(); i ++ ) {
            while (j && s[i] != s[j]) j = next[j - 1];
            if (s[i] == s[j]) j ++ ;
            next[i] = j;
        }
    }

    int strStr(string s, string t) {
        int next[t.size()];
        getNext(next, t);
        for (int i = 0, j = 0; i < s.size(); i ++ ) {
            while (j && s[i] != t[j]) j = next[j - 1];
            if (s[i] == t[j]) j ++ ;
            if (j == t.size()) return i - t.size() + 1;
        }
        return -1;
    }
};

七、重复的子字符串

Leetcode 459

解题关键:在由重复子串组成的字符串中,最长相等前后缀不包含的子串就是最小重复子串

参考题解

class Solution {
public:
    void getNext(int* next, const string& s) {
        next[0] = 0;
        for (int i = 1, j = 0; i < s.size(); i ++ ) {
            while (j && s[i] != s[j]) j = next[j - 1];
            if (s[i] == s[j]) j ++ ;
            next[i] = j;
        }
    }

    bool repeatedSubstringPattern(string s) {
        int next[s.size()];
        getNext(next, s);
        int len = s.size();
        if (next[len - 1] != 0 && len % (len - next[len - 1]) == 0) 
            return true;
        return false;
    }
};

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

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

相关文章

python连接kafka加载数据

背景&#xff1a;读取TXT文件&#xff0c;加载到kafka中&#xff0c;然后通过logstash消费kafka中的数据加载到es中 第一步&#xff1a;导入相应的依赖包 pip install kafka-python pip install loguru pip install msgpack第二步&#xff1a;编写连接kafka的代码 # -*- …

打印机出现错误0x00000709的原因及解决方法

一般来说&#xff0c;出现错误0x00000709&#xff0c;可能是用户试图设置默认打印机时&#xff0c;系统无法完成操作的错误。这种错误通常发生在Windows 10或Windows 7操作系统上。**驱动人生**分析&#xff0c;其原因可能是以下几种情况&#xff1a; 1、已经设置了另一个打印…

解决VMware虚拟机Centos7切换网络更换IP问题

解决VMware虚拟机Centos7切换网络更换IP问题 问题描述Centos7设置固定静态IP 问题描述 学习docker&#xff0c;在VMware虚拟机Centos7系统中使用docker部署了mysql&#xff0c;redis&#xff0c;nacos&#xff0c;虚拟机DHCP分配的ip为192.168.171.128&#xff0c;使用连接工具…

ThinkSystem DM 全闪存阵列 —— 通过全闪存 NVMe 转型加速您的业务

ThinkSystem DM 全闪存阵列——通过全闪存 NVMe 转型加速您的业务 挑战 要缩短产品上市时间并提高客户满意度&#xff0c;企业必须不断改善关键业务运营的速度和响应能力。其中的一个关键要素是全闪存存储&#xff0c;它可以大幅加速关键工作负载。 不过&#xff0c;随着全闪…

电风扇UL507认证指南!!!

UL 507 电风扇UL安全标准 L507标准适用于非工业用风机和鼓风机两大类。一是用于空气循环的风扇&#xff0c;如台扇和吊扇&#xff1b;二是用于通风的风扇&#xff0c;例如阁楼、墙壁、窗户和家用抽油烟机的风扇。此类别的风扇按照 NEC 安装。 测试类似于 UL 705&#xff0c;具…

GitLabCI/CD 构建数据采集与监控

点击上方蓝字⭐️关注“DevOps云学堂”&#xff0c;接收最新技术实践 今天是「DevOps云学堂」与你共同进步的第 25 天 如果这篇文章对您有帮助&#xff0c;欢迎转发点赞分享。您的关注是我持续分享的动力&#xff01; 使用Prometheus对GitLab Runner监控 1.1 配置GitLab Runner…

NGINX 和 HAProxy:基于公有云标准环境的用户体验测试对比

原文作者&#xff1a;Amir Rawdat of F5 原文链接&#xff1a;NGINX 和 HAProxy&#xff1a;基于公有云标准环境的用户体验测试对比 转载来源&#xff1a;NGINX 官方网站 业内许多性能基准测试&#xff0c;都是基于峰值吞吐量或每秒请求数 (RPS)&#xff0c;但这些指标可能会过…

code of ridesharing

chengdu.node: num 经纬度 edge&#xff1a; num 两个节点之间的weight order&#xff1a; 编码了一下 label&#xff1a; 任意两点最短路长度 taxi.txt 司机个数 、capacity 、、变换的系数 司机所在位置、capacity order.txt num 订单提交到系统时间、起点node的id、…

过滤器与拦截器 - 登录校验与登录认证

文章目录 登录校验与登录认证一、登录认证1.1 基础登录功能1.2 会话技术1.2.1 介绍1.2.2 方案一 Cookie1.2.2.1 基本介绍1.2.2.2 服务端向浏览器响应Cookie1.2.2.3 浏览器向服务端请求携带Cookie 1.2.3 方案二 Session1.2.3.1 基本介绍1.2.3.2 服务端向浏览器响应Session1.2.3.…

如何把pdf拆分成一页一页?三个方法试试看

PDF文件作为常用的文件&#xff0c;其功能性较为全面。在日常工作过程中&#xff0c;PDF文件格式便于传输&#xff0c;且pdf文件不易被修改&#xff0c;能够增强文件的安全性和有效性。而在很多时候&#xff0c;为了能够快速地将PDF进行传输、保存等&#xff0c;需要对一些pdf文…

3D模型处理实战【Open3D】

在本文中&#xff0c;我们将学习如何使用 Python 的 Open3D 库探索、处理和可视化 3D 模型。 如果你正在考虑为特定任务处理 3D 数据/模型&#xff0c;例如为 3D 模型分类和/或分割训练 AI 模型&#xff0c;可能会发现本演练很有帮助。 在 Internet 上找到的 3D 模型&#xff…

Netty核心组件模块(二)

1.EventLoop组件 1.1.ChannelHandlerContext 1>.保存Channel相关的所有上下文信息,同时关联一个ChannelHandler对象; ChannelHandlerContext底层真实的类型为:DefaultChannelHandlerContext! 2>.即ChannelHandlerContext中包含一个具体的事件处理器ChannelHandler,同时…

GEE遥感云大数据林业应用典型案例实践及GPT模型应用

目录 一 平台及基础开发平台 二 GEE基础知识与ChatGPT等AI模型交互 三 重要知识点微型案例串讲与GPT模型交互演示 四 典型案例综合演练 更多推荐 聚焦目前遥感应用最热门领域之一的林业&#xff0c;重点结合典型应用案例综合展示GEE云平台的使用技巧和强大功能&#xff0c…

Spring Aop以及SpringBoot统一功能的处理

一.SpringAop 1.SpringAop是一种思想&#xff0c;指的是对使用比较多的功能进行统一处理&#xff0c;比如我们在写博客系统项目&#xff0c;当我们在登录博客列表页和博客详情页以及博客编辑页的时候的时候&#xff0c;都需要写代码进行登录验证&#xff0c;这时候代码就比较繁…

linux内核篇-内存管理(虚拟内存和物理内存、进程虚拟内存布局、内存映射)

主要包括虚拟内存和物理内存、进程内存空间、用户态和内核态的内存映射。 分段机制 分段机制比较符合逻辑&#xff0c;比如可以把程序分成代码段、全局变量段、堆栈段等。 分段的虚拟地址主要包含段选择因子和段内偏移。段选择子就保存在段寄存器中&#xff0c;段选择子中有…

【资料分享】低速数字输入电路

1、方案设计&#xff1a;单通道、单向、反相器 该电路采用单通道&#xff0c;单向光耦&#xff0c;只支持漏型输入&#xff0c;电路的输入端压差满足24V DC10%(21.6V DC-26.4V DC)&#xff0c;输出端电压在0~3.3V范围摆动。 1.1关键技术规格 1.2具体原理图 1.3电路原理详解 …

数字图像处理-基础

数字图像处理-基础 文章目录 一、闲谈二、人类视觉系统三、光和电磁波谱四、图像感知与获取五、图像取样与量化5.1. 数字图像的表示5.2. 空间和灰度分辨率5.3. 图像内插5.3.1. 最近邻内插5.3.2. 双线性内插5.3.3. 双三次内插 六、像素间的关系6.1. 相邻像素6.2. 邻接性、连通性…

【架构设计】阿里开源架构Cola4.0的项目实践:订单系统

项目介绍 使用SpringBootMybaitsPlusCola&#xff08;整洁面向对象分层架构&#xff09;4.0重构订单功能 项目地址 Gitee&#xff1a;https://gitee.com/charles_ruan/smile-cola Github&#xff1a;https://github.com/charles0719/smile-cola 项目核心API 新增 POST http:…

华为OD机试真题 Java 实现【整理扑克牌】【2023Q1 100分】

一、题目描述 给定一组数字&#xff0c;表示扑克牌的牌面数字&#xff0c;忽略扑克牌的花色&#xff0c;请按如下规则对这一组扑克牌进行整理&#xff1a; 步骤1 对扑克牌进行分组&#xff0c;形成组合牌&#xff0c;规则如下&#xff1a; 当牌面数字相同张数大于等于4时&a…

【FPGA】Verilog:锁存器 Latch | RS Flip-Flop 与 D Flip-Flop 的实现

&#x1f4ad; 写在前面&#xff1a;本章将理解 RS/D 锁存器的概念&#xff0c;了解 RS/D/JK 触发器的概念&#xff0c;使用 Verilog 实现各种锁存器 (Latch) 和翻转器 (Flip-Flop)&#xff0c;并通过 FPGA 验证用 Verilog 的实现。 &#x1f4dc; 本章目录&#xff1a; Ⅰ. …