【C++经典例题】字符串特定规则反转问题的解法

【C++经典例题】字符串特定规则反转问题的解法
           💓 博客主页:倔强的石头的ZEEKLOG主页 

           📝Gitee主页:
倔强的石头的gitee主页

            ⏩ 文章专栏:C++经典例题

                                  期待您的关注



目录

问题描述

解题思路

代码实现

复杂度分析


问题描述

在字符串处理的编程领域中,经常会遇到各种复杂的规则要求。

本文将深入探讨一个给定字符串 s 和整数 k,按照特定规则反转字符串的问题

要求从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符

  • 如果剩余字符少于 k 个,则将剩余字符全部反转;
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样

原题链接

541. 反转字符串 II - 力扣(LeetCode)

解题思路

  1. 区间划分:解题的核心在于将字符串按照每 2k 个字符为一个区间进行划分。通过双指针的方式,定义一个左指针 left 来标记每个区间的起始位置,初始时 left 指向字符串的开头 s.begin()。
  2. 确定右边界:对于每个 2k 区间,需要确定其右边界 right。如果当前区间有足够的字符,即 left + 2*k 小于字符串的末尾 s.end(),那么右边界 right 就是 left + 2*k;否则,右边界 right 就是字符串的末尾 s.end()。这一步是为了确定一个2k区间
  3. 确定实际反转的右边界:在每个 2k 区间内,需要进一步确定实际反转的右边界 rightend。如果从 left 开始往后数 k 个字符不超过字符串末尾,即 (left + k) < s.end(),那么实际反转的右边界 rightend 就是 left + k;否则,实际反转的右边界 rightend 就是字符串的末尾 s.end()。这一步是为了满足题目中关于剩余字符数量不同时的反转规则
  4. 反转操作:确定了实际反转的左右边界后,使用 reverse 函数对 [left, rightend) 区间内的字符进行反转。
  5. 移动指针:完成一个区间的处理后,将左指针 left 移动到当前右边界 right 的位置,以便处理下一个 2k 区间。重复上述步骤,直到左指针 left 到达字符串的末尾。

代码实现

class Solution { public: string reverseStr(string s, int k) { string::iterator left = s.begin();//初始左区间 while(left < s.end()) { //初始右区间 string::iterator right = (left + 2*k )< s.end() ? left+ 2*k : s.end(); //确定右区间的实际值 //剩余数量小于k,就全部反转;剩下数量大于k,就反转前k string::iterator rightend =(left + k)<s.end() ? (left + k) : s.end(); reverse(left,rightend); //移动 left = right; } return s; } };
  1. 初始化左指针:string::iterator left = s.begin(); 这行代码初始化了左指针 left,使其指向字符串 s 的开头。
  2. 循环处理区间:while(left < s.end()) 循环用于遍历整个字符串,只要左指针 left 还未到达字符串末尾,就继续处理下一个 2k 区间。
  3. 确定右边界:string::iterator right = (left + 2*k )< s.end()? left+ 2*k : s.end(); 这行代码根据当前 left 的位置和 2k 的长度,确定了当前 2k 区间的右边界 right。
  4. 确定实际反转的右边界:string::iterator rightend =(left + k)<s.end()? (left + k) : s.end(); 这行代码根据当前 left 的位置和 k 的长度,确定了实际需要反转的右边界 rightend。
  5. 反转操作:reverse(left,rightend); 这行代码调用 reverse 函数,对 [left, rightend) 区间内的字符进行反转。
  6. 移动左指针:left = right; 这行代码将左指针 left 移动到当前右边界 right 的位置,为处理下一个 2k 区间做准备。

复杂度分析

  1. 时间复杂度:由于每个字符最多被处理一次,所以时间复杂度为 O(n),其中 n 是字符串的长度
  2. 空间复杂度:代码中只使用了常数级别的额外空间,如指针 left、right 和 rightend,所以空间复杂度为 O(1)

通过上述解题思路和代码实现,我们可以高效地解决这个字符串特定规则反转的问题。这种方法不仅逻辑清晰,而且在时间和空间复杂度上都达到了较好的性能。

Read more

GitHub学生包,还有哪些福利你可以领?

GitHub学生包,还有哪些福利你可以领?

🎁 免费 GitHub Pro 账户 你可能不知道,除了耳熟能详的do和az,真正最有价值的其实是 GitHub Pro。 * 无限私有仓库 * 每月 3,000 分钟 GitHub Actions 和 180 小时 Codespaces 使用时间 * 2GB Packages 存储和 20GB Codespaces 存储 * 高级协作功能 * GitHub Copilot Chat 但但是这几个,每年没有几百美元绝对下不来! 申请链接:https://github.com/education 申请时一定要选择可以搜到的学习,因为是机器审核,不然大概率下不来。申请材料就用录取通知书,其它的通过概率小。 免费域名与托管服务 * .me 域名一年免费(通过 Namecheap) * .TECH 域名一年免费

By Ne0inhk
GitHub Copilot Pro 学生认证免费订阅及VS Code集成完整教程

GitHub Copilot Pro 学生认证免费订阅及VS Code集成完整教程

GitHub Copilot Pro 学生认证免费订阅及VS Code集成完整教程 一、学生认证资格与前期准备 1.1 认证资格要求 GitHub Copilot Pro 为经官方验证的全日制学生、在职教师及热门开源项目维护者提供免费订阅权限。认证需满足以下核心条件: * 学生需提供有效学籍证明(学生卡/学信网认证) * 教师需提供工作证/教师资格证 * 使用学校官方邮箱(以.edu或.edu.cn结尾) * 账户需通过双重身份认证(2FA) 1.2 账户设置准备 1. 绑定教育邮箱 在GitHub账户设置中添加学校邮箱,并完成验证: * 进入Settings → Emails → Add email address * 输入形如[email protected]的邮箱 * 登录学校邮箱查收验证邮件并确认 2. 完善个人信息 在Profile → Edit profile中填写:

By Ne0inhk

完全免费!用阿里开源 CoPaw 养一只属于自己的 AI 小助理(魔搭启动,亲测有效)

先说一个小插曲:前几天我写了一篇介绍 Maxclaw 的文章,当时还是免费的,结果文章发出去没多久,Minimax 就悄悄改了规则,变成 39 元一个月起步了。当然,39 元其实也不贵——毕竟你去闲鱼搜"openclaw 代安装",随便一个人工服务都要 50 块往上走。但既然有完全免费的方案,为什么不用呢? 今天这篇,就给大家介绍一个我亲自跑通的、完全免费的方案:用阿里开源的 CoPaw,在魔搭创空间里一键启动,服务器免费,Token 每天 2000 次免费调用,不用装任何本地环境,浏览器打开就能用。 CoPaw 是什么?先用一分钟搞清楚 很多人第一次听到 CoPaw 这个名字,会以为是某种宠物应用。其实它的全称是 Co Personal Agent Workstation,是阿里

By Ne0inhk
众智鸿图无人机智能巡检:如何用“空中智慧眼”守护城市生命线?

众智鸿图无人机智能巡检:如何用“空中智慧眼”守护城市生命线?

“制高点,决定视野,更决定胜局。” 这一古老的军事法则,不仅适用于战场,也精准地道破了现代城市基础设施安全管理的核心。 过去,水务、燃气管线等城市基础设施的巡检工作,全靠巡检员徒步穿梭于管线之间,如同 “地面部队”,受限于地形阻隔、视野边界。如今,无人机智能巡检正帮助城市基础设施管理者牢牢占据“空中制高点”,完成从“局部零散排查”到“全域动态感知”的安全管理战略升级,让城市生命线的安全防线筑得更牢、更密。 一、解决方案 随着城镇化的高速发展,供水管网、排口、燃气管道、桥梁等城市生命线日益复杂。传统巡检效率低、成本高,更存在覆盖盲区、响应滞后、人员难以到达、安全风险等痛点。国务院于2024年正式实施的《无人驾驶航空器飞行管理暂行条例》,正推动低空经济进入“有法可依、有章可循”的新阶段,也为无人机智能巡检按下加速键。作为国内领先的基础设施智能化综合服务提供商,众智鸿图直面行业发展难题,积极响应国家政策,创新推出“无人机智能巡检解决方案”。 众智鸿图无人机智能巡检解决方案,

By Ne0inhk