LeetCode字符串经典题目(四)

news2024/11/16 7:20:37

1. LeetCode344. 反转字符串

2. LeetCode541. 反转字符串 II

3. LeetCode剑指 Offer 05. 替换空格

4. LeetCode151. 反转字符串中的单词

5. LeetCode剑指 Offer 58 - II. 左旋转字符串

6. LeetCode28. 找出字符串中第一个匹配项的下标​

7. LeetCode459. 重复的子字符串​

1. LeetCode344. 反转字符串

class Solution {
public:
    void reverseString(vector<char>& s) {
        if(s.size()==1){
            return;
        }

        for(int i=0,j=s.size()-1;i<j;i++,j--){
            swap(s[i],s[j]);
        }
    }
};

2. LeetCode541. 反转字符串 II

class Solution {
public:
    string reverseStr(string s, int k) {
        if(s.length()==1){
            return s;
        }


        for(int i=0;i<s.length();i+=k*2){//每2k个字符进行处理,i每次往后移动2k
            if(i>(int)s.length()-k){//由于s.length()为64位无符号整数,和k做运算时要先转为int
                reverse(s.begin()+i,s.end());
                break;
            }else{
                reverse(s.begin()+i,s.begin()+i+k);
            }
        }
        return s;
    }
};

3. LeetCode剑指 Offer 05. 替换空格

双指针:前后指针法
1.不用申请新字符串,节省额外空间
2.从后向前扩充字符串,不用每次填写后向后移动后面所有元素
class Solution {
public:
    string replaceSpace(string s) {
        if(s.length()==0)return s;

        int sOldSize=s.size();//原长度
        
        int countSpace=0;//记录空格数
        for(int i=0;i<s.length();i++){
            if(s[i]==' ')countSpace++;
        }

        s.resize(s.length()+2*countSpace);//在原字符串基础上进行扩充
        int sNewSize=s.size();
        for(int i=sOldSize-1,j=sNewSize-1;i<j;i--,j--){//当i==j时,说明前面的字符串没有空格了
            if(s[i]!=' '){
                s[j]=s[i];
            }else{
                s[j]='0';
                s[j-1]='2';
                s[j-2]='%';
                j-=2;
            }
        }
        return s;
    }
};

4. LeetCode151. 反转字符串中的单词

思路:
1.移除多余空格
2.反转整个字符串
3.反转每个单词
class Solution {
public:
    string reverseWords(string s) {
        //1.移除多余空格
        removeExtraSpaces(s);

        //2.反转整个字符串
        reverse(s,0,s.length()-1);

        //3.反转每个单词
        int start=0;
        for(int i=0;i<=s.length();i++){
            if(i==s.length()||s[i]==' '){//最后一个单词后没有空格
                reverse(s,start,i-1);//s[i-1]是前一个单词的最后一个字符
                start=i+1;//开始位更新为下一个单词的开头
            }
        }
        return s;
    }

    //移除字符串s多余空格
    void removeExtraSpaces(string&s){
        int slow=0;
        for(int fast=0;fast<s.length();fast++){//将快指针不为空格的字符填到慢指针
            if(s[fast]!=' '){
                if(slow!=0)s[slow++]=' ';
                while(fast<s.length()&&s[fast]!=' '){
                    s[slow++]=s[fast++];
                }
            }
        }
        s.resize(slow);//slow的大小和移除多余空格后的字符串长度相等
    }

    void reverse(string&s,int start,int end){
        for(int i=start,j=end;i<j;i++,j--){
            swap(s[i],s[j]);
        }
    }
};

5. LeetCode剑指 Offer 58 - II. 左旋转字符串

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        int sOldSize=s.length();
        s+=s;//所有左旋转子串都是拼接字符串的子串,且第一位和n相等
        return s.substr(n,sOldSize);
    }
};

6. LeetCode28. 找出字符串中第一个匹配项的下标

前缀:指不包含最后一个字符的所有以第一个字符开头的连续子串。
后缀:指不包含第一个字符的所有以最后一个字符结尾的连续子串。
class Solution {
public:
    int strStr(string haystack, string needle) {
        int i1=0;//haystack中比对的下标
        int i2=0;//needle中比对的下标
        vector<int>next=getNext(needle);

        while(i1<haystack.length()&&i2<needle.length()){
            if(haystack[i1]==needle[i2]){
                i1++;
                i2++;
            }else if(i2==0){//没有前缀了就让i1后移
                i1++;
            }else{
                //换作前缀部分去和当前大的haystack[i1]比较
                //因为next数组记录的是前缀长度的特性,所以一定是i2往前跳而不是i1往后跳
                //相当于把needle相应前缀拉到当前取比对
                i2=next[i2];
            }
        }
        //结束循环后,除非i2比对到最后一个字符且相等
        //否则就是i1都比对到最后字符也没有找到相应子串
        return i2==needle.length()?i1-i2:-1;
    }

    //获取字符串str的next数组
    vector<int>getNext(string str){
        if(str.length()==1)return{-1,0};

        vector<int>next(str.length());//next[i]:str(0,i)最长公共前后缀长度,不包含str[i]
        //默认值
        next[0]=-1;
        next[1]=0;
        int i=2;//0、1已确定,从2开始
        int cn=0;//cn是next[2-1]的值,也恰好是要对比的索引
        while(i<str.length()){
            if(str[i-1]==str[cn]){
                next[i++]=++cn;
            }else if(cn>0){//回到上一个可能是最长公共前缀的最后一位
                cn=next[cn];
            }else{
                next[i++]=0;
            }
        }
        return next;
    }
};

7. LeetCode459. 重复的子字符串

移动匹配:
任何可由重复子串组成的字符串都可以分成相同的两半,所以把该字符串拼接起来后,必定会包含原字符串
class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        string ss=s+s;
        //掐头去尾,不然ss里必定包含s
        ss.erase(ss.begin());
        ss.erase(ss.end()-1);
        //如果ss里有s,说明s可以被分成相同的两半,也就可以由重复子串组成了
        if(ss.find(s)==std::string::npos)return false;
        return true;
    }
};

kmp:
能由重复子串组成的字符串的最小组成单位是最长公共前后缀不包含的那一部分
class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        if(s.size()==1){
            return false;
        }
        //next[i]:s(0,i)最长公共前后缀长度-1,因为j从-1开始
        vector<int>next=getNext(s);
        int maxPreLen=next[next.size()-1];
        int len=s.length()-maxPreLen-1;
        if(maxPreLen!=-1&&s.length()%len==0){
            return true;
        }
        return false;
    }

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

 

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

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

相关文章

Mac内存空间不足如何释放储存空间?深度清理Mac磁盘空间的方法教程

今日coco玛奇朵将分享一些能够释放大量Mac内存空间的方法&#xff0c;以便大家能够优化Mac的运行速度外还能规避由于Mac空间不足而导致安装Ventura时出现的一系列问题。 大家都知道更新Macos都需要预备非常大的内存空间才能进行&#xff0c;当更新完Macos之后都会留下大量的备…

台大应用深度学习笔记

deep learning end-to-end training 1. 神经元 1.1 为什么需要bias&#xff1f; 为了给对应位置一个prior&#xff0c;给它一个初始值&#xff0c;b越大&#xff0c;σ(z)11e−z\sigma(z) \frac{1}{1e^{-z}}σ(z)1e−z1​越大&#xff0c;越趋向于1. 多层神经网络&#xff…

安装Windows和Ubuntu双系统

制作Ubuntu安装盘在Windows上查看磁盘格式 不同的磁盘格式&#xff0c;需要跟BIOS里面不同的引导模式配合来启动操作系统&#xff0c;如下图&#xff1a; 我的电脑是GPT格式&#xff1a; 准备好给Ubuntu的磁盘空间 在Windows系统中&#xff0c;在一个200G的清空数据的磁盘上…

【Flask-Web】基于layui前端模板搭建简易管理系统

1. JavaScript 1.1. 函数 var cars ["Saab", "Volvo", "BMW"]; var txt "string"; var b2new Boolean(1); var x Math.PI; // 返回PI var y Math.sqrt(16); // 返回16的平方根 var num new Number(value); try {adddlert("…

aws eks 理解和使用terrafrom创建eks集群(离线安装provider和module)

参考 使用 Terraform 在 AWS 中国区域实现自动化部署指南系列1使用 Terraform 在 AWS 中国区域实现自动化部署指南系列2https://lonegunmanb.github.io/introduction-terraform/加速 Terraform init terraform 相关概念 terraform是对标aws cloud formation的iac工具&#x…

Redis集群系列十一 —— 故障转移一

故障发现 Redis 集群内节点通过 ping/pong 消息实现节点通信&#xff0c;消息不但可以传播节点槽信息&#xff0c;还可以传播其他状态。当集群中某个节点出现问题时&#xff0c;需要识别出节点是否发生了故障&#xff0c;因此故障发现是通过Gossip 协议来广播自己的状态以及自…

日志系统:WAL和二阶段提交

1. 前言 一条更新语句在执行过程中不仅仅要操作不仅仅是通过数据库的组件(分析器、优化器、执行器、存储引擎等&#xff09;操作表数据还涉及以下内容&#xff1a; 要操作日志系统的redo log、binlog和undo log&#xff0c; 更新操作也不是实时更新到磁盘的而是通过3.Write-A…

DDR3 数据传输 (五)

目录 引言 设计说明 参数说明 设计简图 IP配置说明 写FIFO IP

在linux上使用CMake构建和安装gtest

在linux上使用CMake构建和安装gtest一、准备工作二、构建并安装gtest的静态库三、构建并安装gtest的共享库一、准备工作 本机环境&#xff1a; 系统版本&#xff1a;RHEL 7.6GCC/G版本&#xff1a; 12.1.1googletest版本&#xff1a;1.12.1 注意&#xff0c;gtest的1.12.x分…

基于准则匹配的图像对准

一、概述 在图像处理相关的问题中&#xff0c;图像对准是一类典型的问题&#xff0c;也就是要将两幅图严丝合缝地对应起来。通常来讲&#xff0c;两幅图大小不一&#xff0c;一个是模板&#xff0c;一个是母图&#xff0c;也就是要在母图中搜寻定位到与模板图最为接近的区域。 …

QML教程(七) JavaScript

目录 一、对属性值使用 JavaScript 表达式 二、在 QML 中添加 JavaScript 函数 三、使用 JavaScript 文件 四、属性绑定中的 JavaScript 五、信号处理程序中的 JavaScript 六、将信号连接到 JavaScript 函数 七、启动执行 JavaScript QML 提供的 JavaScript 主机环境可以…

算法学习-并查集(持续更新中)

本文参考&#xff1a; 最容易理解的并查集详解 详解&#xff1a;并查集&#xff08;Union-Find&#xff09; 「代码随想录」684. 冗余连接:【并查集基础题目】详解&#xff01; 并查集从入门到出门 并查集常常在做图相关的题目时冒出来&#xff0c;但是笔者经常去回避这样的解法…

Exynos_4412——轮询与中断

目录 一、CPU与硬件的交互方式 1.1轮询 1.2中断 1.3DMA 二、轮询方式的按键实验 三、GPIO中断相关寄存器 四、GPIO中断编程 五、小作业 一、CPU与硬件的交互方式 1.1轮询 CPU执行程序时不断地询问硬件是否需要其服务&#xff0c;若需要则给予其服务&#xff0c;若不需…

Android Jetpack Compose——一个简单的微信界面

一个简单的微信界面简述效果视频底部导航栏导航元素导航栏放入插槽绘制地图消息列表效果图实现聊天效果图实现气泡背景联系人界面效果图实现好友详情效果图实现发现效果图实现未读红点未读条数朋友圈效果图实现上拉加载个人设置效果图实现个人信息功能区钱包效果图实现切换主题…

【Vue】项目搭建规范

1. 集成editorconfig配置 EditorConfig 有助于为不同 IDE 编辑器上处理同一项目的多个开发人员维护一致的编码风格。 VSCode需要安装一个插件&#xff1a;EditorConfig for VS Code 创建 .editorconfig 文件&#xff1a; # http://editorconfig.orgroot true[*] # 表示所有文…

js Proxy 的使用

文章目录一、什么是Proxy二、语法三、Proxy 方法1、get() 方法2、set() 方法3、apply() 方法4、has() 方法5、construct() 方法6、deleteProperty() 方法一、什么是Proxy Proxy 可以理解成&#xff0c;在目标对象之前架设一层“拦截”&#xff0c;外界对该对象的访问&#xff…

[Vulnhub] DC-2

Vlunhub下DC系列靶机第二台&#xff0c;难度与DC-1 差不多&#xff0c;为简单。共有五个Flag 下载地址&#xff1a;Vulnhub:DC-2 目录 信息搜集 cewl爬行网站字典&hydra爆破wordpress用户密码 -rbash逃逸 git提权 信息搜集 nmap -sP 192.168.236.0/24 扫描一下靶机i…

c++语法欠缺地方(持续更新)

sizeof是用来计算变量占多大内存的&#xff0c;单位是字节&#xff08;byte&#xff09;&#xff1b;sizeof 后面跟类型时&#xff0c;必须加上括号&#xff0c;例如sizeof(double);后面跟变量可以不用加括号&#xff0c;例如&#xff1a;sizeof d %d是以十进制形式输出有符号…

hadoop之kerberos权限配置(ranger基础上)(三)

文章目录一、kerberos服务端二、kerberos客户端三、hadoop集群安装HTTPS服务四、kerberos整合zk五、kerberos整合ranger六、kerberos整合hdfs七、kerberos整合yarn八、kerberos整合hive九、kerberos整合hbase十、遇到的问题一、kerberos服务端 上传kerberos安装包到/opt/rpm 安…

数据库,计算机网络、操作系统刷题笔记22

数据库&#xff0c;计算机网络、操作系统刷题笔记22 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle…