【string题解 C++】翻转字符串II:区间部分翻转 | 验证回文串

news2025/1/25 4:26:19

翻转字符串II:区间部分翻转

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

难度:简单

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

如果剩余字符少于 k 个,则将剩余字符全部反转。

如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例 1:

输入:s = "abcdefg", k = 2
输出:"bacdfeg"

示例2:

输入:s = "abcd", k = 2
输出:"bacd"

思路

其实这道题难点在于理解题目到底想干嘛,get到它的意图以后,实现起来就不难了。

而理解题意,最好的办法是画图:

画出这几种情况后,我们发现,题意实际为:反转每个 下标从 2k 的倍数开始的,长度为 k 的子串。若该子串长度不足 k,则反转整个子串。(理解题意真的很重要!!)

可以对string实现分组,每k个为一组,然后组与组之间间隔着反转(第一组反转,第二组不反转,第三组反转……)。

实现

class Solution {
public:
    string reverseStr(string s, int k) {
        int num=s.size();
        int i=0;
        int multiple=0;    //left的下标是成倍增长的,所以我们引入multiple
        while(i<num){
            int left=2k*multiple;
            if(left<num){     //能进说明有left存在,也就是说有可被反转的组
                if(left+k<num){   
                    int right=left+k;
                    reverse(s.begin()+left,s.begin()+right);
                }
                else{    //能进这里说明:到字符串的末尾了
                    reverse(s.begin()+left,s.end());
                    break;
                }
                multiple++;
                i=left;
            }
            else{
                break;
            }
        }
        return s;
    }
};

更好的解决方式

遍历一遍string,下标为2k倍数的都拿去reverse。注意看这里对于末尾的处理,巧妙地运用了min函数:

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

验证回文串

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

难度:简单

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串

字母和数字都属于字母数字字符。

给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false

示例 1:

输入: s = "A man, a plan, a canal: Panama"
输出:true
解释:"amanaplanacanalpanama" 是回文串。

示例 2:

输入:s = "race a car"
输出:false
解释:"raceacar" 不是回文串。

示例 3:

输入:s = " "
输出:true
解释:在移除非字母数字字符之后,s 是一个空字符串 "" 。
由于空字符串正着反着读都一样,所以是回文串。

思路

我们可以实例化出两个string变量:str1、str2。

首先,遍历字符串 ,将其过滤出来的数字字符 正着放进str1。

然后,遍历str1 ,将其反着放进str2。

最后,遍历str1和str2,对比两者。

实现

class Solution {
public:
    bool isPalindrome(string s) {
        if(s==" "){
            return true;
        }
        int num=s.size();
        string str1,str2;
        for(int i=0;i<num;i++){
            if(s[i]>='0'&&s[i]<='9'
            ||s[i]>='A'&&s[i]<='Z'
            ||s[i]>='a'&&s[i]<='z'){
                if(s[i]>='A'&&s[i]<='Z'){   //大写转小写
                    s[i]+='a'-'A';
                }
                str1.push_back(s[i]);   //正着插入str1  
            }
        }
        
        string::reverse_iterator rit=str1.rbegin();  //反着插入str2
        while(rit!=str1.rend()){
            str2.push_back(*rit);
            rit++;
        }
​
        for(int i=0;i<str1.size();i++){   //遍历str1、str2,对比两者
            if(str1[i]!=str2[i]){
                return false;
            }
        }
        return true;
    }
};

更好的解决方式

同样的思路,怎么实现才能优化上面的代码?

1.用库里的函数!多用才能熟练。目前我们不知道有哪些函数可以为我所用,不要紧,看题解,它用的函数我们没用过,那我就自己再写一遍,把这个函数拿出来多用用。

2.字符串的比较不需要再遍历的。直接用str1==str2。

class Solution {
public:
    bool isPalindrome(string s) {
        string str1;
        for(auto ch:s){
            if(isalnum(ch)){
                if(ch>='A'&&ch<='Z'){
                    ch+='a'-'A';
                }
                str1+=ch;
            }
        }
        string str2(str1.rbegin(),str1.rend());
        return str1==str2;
    }
};

这种写法的时间复杂度为O(n)(n为字符串的长度)。空间复杂度为O(n)。

关于函数isalnum:

用于判断是否是数字or字符串。

只有在函数isdigit()(判断是否为数字的)和isalpha()(判读是否为字母的)都返回true时,isalnum才会返回true。

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

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

相关文章

【Mybatis】基于TypeHandler实现敏感数据加密

一、介绍 业务场景中经常会遇到诸如用户手机号&#xff0c;身份证号&#xff0c;银行卡号&#xff0c;邮箱&#xff0c;地址&#xff0c;密码等等信息&#xff0c;属于敏感信息&#xff0c;需要保存在数据库中。而很多公司会会要求对数据库中的此类数据进行加密存储。 敏感数据…

【JY】求?减隔震元件的滞回面积~

写在前文 为了求解等效阻尼比&#xff0c;通常我们需要求解滞回圈的面积&#xff0c;由于形状不是常见规整可直接套用长乘宽的形状&#xff0c;因此大多数人经常无从下手&#xff0c;或者分割分割再分割&#xff0c;一顿操作猛如虎&#xff0c;然后再得出结果。 计算方法 不论是…

私仓库Nexus

私仓库Nexus搭建 没有命令提示符tab键无效 #安装Linux命令补全工具 yum -y install bash-completion #执行bash或者reboot重启系统 bash#如果上述的命令执行了有问题可以执行功能下面的命令 yum install epel-release -y yum install bash-completion bash-completion-extras…

[资源推荐]langchain、LLM相关

之前很多次逛github或者去B站看东西或者说各种浏览资讯的情况&#xff0c;都会先看两眼然后收藏然后就吃灰的情况&#xff0c;那既然这样&#xff0c;不如多看几眼&#xff0c;看看是否真的能用得上&#xff0c;能用在哪&#xff0c;然后用几句话总结出来&#xff0c;分享出来&…

rsync 备份工具(附rsync+inotify 实时同步部署实例)

rsync 备份工具(附rsyncinotify 实时同步部署实例&#xff09; 1、rsync概述1.1关于rsync1.2rsync 的特点1.3工作原理 2、rsync相关命令2.1基本格式和常用选项2.2启动和关闭rsync服务2.3下行同步基本格式2.4上行同步基本格式2.5免交互2.5.1指定密码文件2.5.2rsync-daemon方式2.…

推荐《Blue prison》

电视动画片《蓝色监狱》改编自金城宗幸原作、野村优介作画的同名漫画作品&#xff0c;于2021年7月31日宣布电视动画化的消息 [1]。该片由8Bit负责动画制作&#xff0c;于2022年10月9日起播出 [2]&#xff0c;全24集。 该作评为Anime Corner 2022年年度体育动画 [24]&#xff0…

【MongoDB】MongoDB 的介绍和使用

1. 关系型与非关系型数据库 关系型数据库&#xff08;RDBMS&#xff09;和非关系型数据库&#xff08;NoSQL&#xff09;是两种不同类型的数据库管理系统。 关系型数据库是基于关系模型的数据库。它使用表&#xff08;关系&#xff09;来保存数据&#xff0c;并且通过事先定义…

雷电模拟器上使用第一个frida(一)之安装

环境&#xff1a;win10 64&#xff0c;雷电模拟器9.0.60(9)&#xff0c;Android 9&#xff0c;本机Python 3.10.4&#xff0c;路径&#xff1a; python3路径 cd C:\Users\LC\AppData\Local\Programs\Python\Python310pip3路径 cd C:\Users\LC\AppData\Local\Programs\Python\P…

草莓病害图像数据集(YOLO使用,train为655张照片和val为487张照片)

前言&#xff1a;所有图像和标签是一一对应&#xff0c;没有标签缺失 写了两个程序来分别检查train文件夹的图像和val文件夹图像是否有缺失标签&#xff0c;如果有&#xff0c;会直接打印出缺失标签的图像名字。也方便以后用户自己添加自己收集的图像数据后&#xff0c;核对图…

NNDL:作业3:分别使用numpy和pytorch实现FNN例题

对比【numpy】和【pytorch】程序&#xff0c;总结并陈述。 激活函数Sigmoid用PyTorch自带函数torch.sigmoid()&#xff0c;观察、总结并陈述。 激活函数Sigmoid改变为Relu&#xff0c;观察、总结并陈述。 损失函数MSE用PyTorch自带函数 t.nn.MSELoss()替代&#xff0c;观察、总…

软件工程与计算总结(十二)详细设计的基础

目录 一.详细设计概述 1.出发点 2.上下文 二.结构化设计 1.思想 2.过程 三.面向对象设计 1.思想 2.过程 3.通过职责建立静态模型 4.通过协作建立动态模型 四.为类间协作开发集成测试用例 五.详细设计文档描述 六.详细设计的评审 一.详细设计概述 1.出发点 详细…

Java前后端交互实现班级管理(查询)

1&#xff0c;数据库创建存储专业信息的表 2&#xff0c;后端&#xff1a; 连接数据库工具类DBUtil.java&#xff1a; package com.ffyc.webserver.util;import java.sql.*;public class DButils {static {try {Class.forName("com.mysql.cj.jdbc.Driver");} catch…

施耐德Unity通过Modbus控制变频器

硬件设备 PLC: Unity Premium (CPU:TSX P57154) 通讯卡: TSX SCP 114 连接电缆: TSX SCP CM 4030 VSD: ATV 58 硬件连接 Unity Premium (CPU: TSX P57154)本身不带Modbus接口&#xff0c;因此&#xff0c;采用TSX SCP 114扩展一个Modbus接口。TSX SCP 114是一个RS-485接…

java集合之Collection接口体系

一、集合概述 java集合框架标准化了程序处理对象组的方式&#xff0c;它是在J2SE 1.2版本时增加的。 在集合框架之前&#xff0c;Java提供了特定的类来存储和管理对象组&#xff0c;如Dictionary、Vector、Stack、Properties。尽管这些类很有用&#xff0c;但是缺少了集…

甲醇燃料电池(DMFC) 系统

甲醇燃料电池&#xff08;DMFC&#xff09; 系统框图 ~~

宅在家里也能干的副业,每天挣60—300元,人人可做

想在家搞副业&#xff0c;每天挣60-300元&#xff0c;大家觉得难吗&#xff1f;我告诉你&#xff0c;一点也不难。找对路子&#xff0c;足不出户也能搞钱。今天我就给大家分享一下三个网上靠谱的副业&#xff0c;门槛低上手快&#xff0c;只需一部手机&#xff0c;每天利用碎片…

【Java每日一题】— —第三十一题:银行账号管理程序设计(2023.10.15)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

Elasticsearch系列组件:Kibana无缝集成的数据可视化和探索平台

Elasticsearch 是一个开源的、基于 Lucene 的分布式搜索和分析引擎&#xff0c;设计用于云计算环境中&#xff0c;能够实现实时的、可扩展的搜索、分析和探索全文和结构化数据。它具有高度的可扩展性&#xff0c;可以在短时间内搜索和分析大量数据。 Elasticsearch 不仅仅是一个…

Java课程设计——图书管理系统

文章目录 一、需求分析二、技术介绍2.1相关技术2.2开发环境 三、功能实现1、登录2、图书管理2.1图书列表2.2添加图书2.3修改图书信息2.4查询图书信息 3、用户管理3.1借阅图书3.2修改借阅信息3.3归还图书 4、退出系统 四、部分代码实现获取源码 文章最下方获取源码&#xff01;&…

【Retinex theory】【图像增强】-笔记

1 前言 retinex 是常见的图像增强的方法&#xff0c;retinex 是由两个单词合成的&#xff1a;retina conrtex &#xff0c;即视网膜皮层。 2 建立的基础 Land 的 retinex theory 建立在三个假设之下&#xff1a; 真实世界是无色的&#xff0c;我们所谓的颜色是光和物质相互…