C++数据结构与算法——字符串

C++第二阶段——数据结构和算法,之前学过一点点数据结构,当时是基于Python来学习的,现在基于C++查漏补缺,尤其是树的部分。这一部分计划一个月,主要利用代码随想录来学习,刷题使用力扣网站,不定时更新,欢迎关注!

文章目录

  • 一、反转字符串(力扣344)
  • 二、反转字符串 II(力扣541)
  • 三、替换数字(卡码网 54)
  • 四、翻转字符串里的单词(力扣151)
  • 五、右旋字符串(卡码网 55)
  • 六、找出字符串中第一个匹配项的下标(力扣28)
  • 七、重复的子字符串(力扣459)

一、反转字符串(力扣344)

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
示例 1:
输入:s = [“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]
示例 2:
输入:s = [“H”,“a”,“n”,“n”,“a”,“h”]
输出:[“h”,“a”,“n”,“n”,“a”,“H”]
提示:
1 <= s.length <= 105
s[i] 都是 ASCII 码表中的可打印字符

class Solution {
public:void reverseString(vector<char>& s) {// 双指针解决int begin =0;int end = s.size()-1;while(begin<end){// 交换char temp = s[begin];s[begin] = s[end];s[end] = temp;begin++;end--;}}
};

在这里插入图片描述

二、反转字符串 II(力扣541)

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 1:
输入:s = “abcdefg”, k = 2
输出:“bacdfeg”
示例 2:
输入:s = “abcd”, k = 2
输出:“bacd”
提示:
1 <= s.length <= 104
s 仅由小写英文组成
1 <= k <= 104

class Solution {
public:string reverseStr(string s, int k) {// 每2k个字符移动一次ifor(int i=0;i<s.length();i+=2*k){// 翻转前k个if(i+k<s.size()){ // i+k<s.size说明 k<i.size<2*k,需要翻转前k个reverse(s.begin()+i,s.begin()+i+k);}else{// 将最后所有的剩余元素都翻转reverse(s.begin()+i,s.begin()+s.size());}//}return s;}
};

在这里插入图片描述

三、替换数字(卡码网 54)

题目描述
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 “a1b2c3”,函数应该将其转换为 “anumberbnumbercnumber”。
输入描述
输入一个字符串 s,s 仅包含小写字母和数字字符。
输出描述
打印一个新的字符串,其中每个数字字符都被替换为了number
输入示例
a1b2c3
输出示例
anumberbnumbercnumber
提示信息
数据范围:
1 <= s.length < 10000。

#include <iostream>
using namespace std;int main() {string inputS;cin >> inputS;int count = 0;// 遍历原来数组,记录其中数字的个数for (int i = 0; i < inputS.length(); i++) {if (inputS[i] <= '9' && inputS[i]>='0') {count++;}}int FLength = inputS.length();// resize 原来的字符串inputS.resize(FLength + count * 5);// 替换原来字符串中的字符,从后向前替换int j = inputS.length()-1;for (int i = FLength - 1; j>i; i--,j--) {if (inputS[i] <= '9' && inputS[i]>='0') {// 是数字要替换inputS[j] = 'r';inputS[j-1] = 'e';inputS[j-2] = 'b';inputS[j-3] = 'm';inputS[j-4] = 'u';inputS[j-5] = 'n';j -= 5;}else {inputS[j] = inputS[i];}}cout << inputS << endl;system("pause");return 0;}

在这里插入图片描述

四、翻转字符串里的单词(力扣151)

给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: “the sky is blue”
输出: “blue is sky the”
示例 2:
输入: " hello world! "
输出: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: “a good example”
输出: “example good a”
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

class Solution {
public:string reverseWords(string s) {// 去除空格removeSpace(s);// // 翻转整个句子reverse(s.begin(), s.end());// 翻转每个单词// 首先找到每个单词的位置int slow=0;for(int fast=0;fast<s.length();fast++){if(s[fast+1]==' ' || fast==s.length()-1){reverseWord(s,slow,fast);slow = fast+2;}}return s;}// 翻转每个单词void reverseWord(string& s, int begin, int end) {while (begin < end) {swap(s[begin], s[end]);begin++;end--;}}// 去除字符串中多余的空格void removeSpace(string& s) {// 快慢指针去除空格int slow = 0;for (int fast = 0; fast < s.length(); fast++) {if (s[fast] != ' ') {// 不为空格才进行下面的操作// 添加每个单词之间的空格,句子开头不加if (slow != 0) {s[slow] = ' ';slow++;}while (fast<s.size() && s[fast] != ' ') {s[slow] = s[fast];slow++;fast++;}}}s.resize(slow);}};

在这里插入图片描述

五、右旋字符串(卡码网 55)

字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。
例如,对于输入字符串 “abcdefg” 和整数 2,函数应该将其转换为 “fgabcde”。
输入描述
输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。
输出描述
输出共一行,为进行了右旋转操作后的字符串。
输入示例
2
abcdefg
输出示例
fgabcde
提示信息
数据范围:
1 <= k < 10000,
1 <= s.length < 10000;

#include <iostream>
using namespace std;
#include<algorithm>
string func(string s,int k){reverse(s.begin(),s.end());reverse(s.begin(),s.begin()+k);reverse(s.begin()+k,s.end());return s;
}
int main(){int k;string s;cin>>k>>s;s = func(s,k);cout<<s<<endl;return 0;
}

在这里插入图片描述

六、找出字符串中第一个匹配项的下标(力扣28)

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。
示例 1:
输入:haystack = “sadbutsad”, needle = “sad”
输出:0
解释:“sad” 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。
示例 2:
输入:haystack = “leetcode”, needle = “leeto”
输出:-1
解释:“leeto” 没有在 “leetcode” 中出现,所以返回 -1 。
提示:
1 <= haystack.length, needle.length <= 104
haystack 和 needle 仅由小写英文字符组成

class Solution {
public:int strStr(string haystack, string needle) {// 剪枝操作int hLength = haystack.length();int nLength = needle.length();if(needle.length()>haystack.length()){return -1;}// 在haystack中找 neddlefor(int i=0;i<hLength-nLength+1;i++){if(haystack[i]==needle[0]){// 定义两个指针int h=i;int n=0;int flag =0;while(n<nLength){if(haystack[h]==needle[n]){h++;n++;}else{flag = 1;break;}}if(flag==0){return i;}}}return -1;}
};

在这里插入图片描述

七、重复的子字符串(力扣459)

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。
示例 1:
输入: s = “abab”
输出: true
解释: 可由子串 “ab” 重复两次构成。
示例 2:
输入: s = “aba”
输出: false
示例 3:
输入: s = “abcabcabcabc”
输出: true
解释: 可由子串 “abc” 重复四次构成。 (或子串 “abcabc” 重复两次构成。)
提示:
1 <= s.length <= 104
s 由小写英文字母组成

class Solution {
public:bool repeatedSubstringPattern(string s) {// 两个拼在一起string addS = s+s;// 掐头去尾addS.erase(addS.begin());addS.erase(addS.end()-1);if(addS.find(s)!=std::string::npos){return true;}return false;}
};

在这里插入图片描述

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

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

相关文章

2024年【危险化学品经营单位安全管理人员】免费试题及危险化学品经营单位安全管理人员考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员免费试题参考答案及危险化学品经营单位安全管理人员考试试题解析是安全生产模拟考试一点通题库老师及危险化学品经营单位安全管理人员操作证已考过的学员汇总&#xff0c;相对有效帮助…

WordPress作者页面链接的用户名自动变成16位字符串串插件Smart User Slug Hider

WordPress默认的作者页面URL链接地址格式为“你的域名/author/admin”&#xff0c;其中admin就是你的用户名&#xff0c;这样的话就会暴露我们的用户名。 为了解决这个问题&#xff0c;前面boke112百科跟大家分享了『如何将WordPress作者存档链接中的用户名改为昵称或ID』一文…

Linux进程间通信(二)-----system V共享内存

共享内存的概念 共享内存让不同进程看到同一份资源的方式就是&#xff0c;在物理内存当中申请一块内存空间&#xff0c;然后将这块内存空间分别与各个进程各自的页表之间建立映射&#xff0c;再在虚拟地址空间当中开辟空间并将虚拟地址填充到各自页表的对应位置&#xff0c;使得…

书生浦语大模型实战营-课程作业(3)

下载sentence_transformer的代码运行情况。sentence_transformer用于embedding&#xff08;转向量&#xff09; 本地构建持久化向量数据库。就是把txt和md文件抽取出纯文本&#xff0c;分割成定长&#xff08;500&#xff09;后转换成向量&#xff0c;保存到本地&#xff0c;称…

Python算法题集_二叉树的层序遍历

Python算法题集_二叉树的层序遍历 题102&#xff1a;二叉树的层序遍历1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【DFS递归】2) 改进版一【BFS迭代】3) 改进版二【BFS迭代循环】 4. 最优算法 本文为Python算法题集之一的代码示例 题102&am…

python 人脸检测器

import cv2# 加载人脸检测器 关键文件 haarcascade_frontalface_default.xml face_cascade cv2.CascadeClassifier(haarcascade_frontalface_default.xml)# 读取图像 分析图片 ren4.png image cv2.imread(ren4.png) gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 进行人脸…

数据密集型应用系统设计

数据密集型应用系统设计 原文完整版PDF&#xff1a;https://pan.quark.cn/s/d5a34151fee9 这本书的作者是少有的从工业界干到学术界的牛人&#xff0c;知识面广得惊人&#xff0c;也善于举一反三&#xff0c;知识之间互相关联&#xff0c;比如有个地方把读路径比作programming …

ESP32学习(4)——电脑远程控制LED灯

1.思路梳理 首先需要让ESP32连接上WIFI 然后创建udp socket 接着接收udp数据 最后解析数据&#xff0c;控制LED 2.代码实现 import network from socket import * from machine import Pin p2Pin(2,Pin.OUT)def do_connect(): #连接wifi wlan network.WLAN(network.STA_IF)…

122.乐理基础-五线谱-音程、度数、根音、冠音

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;五线谱的临时变音记号规则 上一个内容里练习的答案&#xff1a; 1-121看完就可以认识乐谱、熟悉乐谱了&#xff0c;从现在开始与识谱无关&#xff0c;与创作有关 参考图&#xff1a;音程与和弦只是为了撬开去往和…

Vue2学习第一天

Vue2 学习第一天 1. 什么是 vue? Vue 是一套用于构建用户界面的渐进式框架。 2. vue 历史 vue 是在 2013 年创建的&#xff0c;vue3 是 2020 出现的&#xff0c;现在主要是用 vue2&#xff0c;创新公司用的是 vue3 vue 的作者是尤雨溪&#xff0c;vue 的搜索热度比 react…

jacob使用教程---OFFICE操作几乎万能公式---读写XML

参考资料: jacob的GitHub地址https://github.com/freemansoft/jacob-project jacob官网(个人感觉不重要)https://danadler.com/tech-articles/jacob-2/ microsoft官方VBA文档(很重要,jacob所有的参数都来自于这里)https://learn.microsoft.com/zh-cn/office/vba/api/o…

多线程的基本原理学习

由一个问题引发的思考 线程的合理使用能够提升程序的处理性能&#xff0c;主要有两个方面&#xff0c;第一个是能够利用多核cpu以及超线程技术来实现线程的并行执行&#xff1b;第二个是线程的异步化执行相比于同步执行来说&#xff0c;异步执行能够很好的优化程序的处理性能提…

【Day42】代码随想录之动态规划0-1背包_416. 分割等和子集

文章目录 动态规划理论基础动规五部曲&#xff1a;出现结果不正确&#xff1a; 416. 分割等和子集 动态规划理论基础 动规五部曲&#xff1a; 确定dp数组 下标及dp[i] 的含义。递推公式&#xff1a;比如斐波那契数列 dp[i] dp[i-1] dp[i-2]。初始化dp数组。确定遍历顺序&am…

【JAVA-Day87】线程终止问题

线程终止问题 线程终止问题&#xff0c;什么情况下需要终止线程&#xff0c;如何终止Java线程&#xff1f;摘要引言1. 理解线程终止&#xff1a;它代表什么&#xff1f;&#x1f6d1;线程终止的方式线程终止的含义注意事项示例代码 2. 何时需要终止线程&#xff1f;&#x1f91…

新机Word/PowerPoint新建空白文档后闪退问题

首先可以尝试一下常规的修复&#xff1a; 设置-应用-安装的应用-搜索office-点击Micros Office Home and Student...右侧三个点-选择修改-点击是-快速修复-修复 再不行就按上面的选择联机修复&#xff0c;这个会卸载现有Office然后自动帮你重新下载 我做了以上两个都没有解决问…

TMGM官网平台开户运作流程如下:

TMGM官网平台开户运作流程如下&#xff1a; 首先&#xff0c;投资者需要注册并登录TMGM官网平台。在平台上&#xff0c;投资者可以选择适合自己的交易账户类型&#xff0c;包括标准账户、高级账户等。 然后&#xff0c;投资者需要进行身份验证和资金入账操作。TMGM会要求投资…

使用 XML 和 YAML 文件的文件输入和输出

目标 您将找到以下问题的答案&#xff1a; 如何使用YAML或XML文件打印和读取文件和OpenCV的文本条目&#xff1f;如何对 OpenCV 数据结构做同样的事情&#xff1f;如何为您的数据结构执行此操作&#xff1f;使用 OpenCV 数据结构&#xff0c;例如 cv&#xff1a;&#xff1a;…

致创新者:聚焦目标,而非问题

传统的企业创新管理方式常常导致组织内部策略不协调、流程低效、创新失败率高等问题。而创新运营作为企业管理创新的新模式&#xff0c;通过整合文化、实践、人员和工具&#xff0c;提高组织创新能力。已经采用创新运营的公司报告了一系列积极的结果&#xff0c;如市场推出速度…

详解函数指针变量,函数指针数组及转移表【超详细建议收藏点赞】

目录 1. 函数指针变量1.1 函数指针变量的创建1.2 函数指针变量的使用1.3 两段有趣的代码 2. 函数指针数组3. 转移表 1. 函数指针变量 什么是函数指针变量呢&#xff1f; 前面我们已经了解了整型指针与函数指针&#xff0c;通过类比我们可以知道&#xff1a; 函数指针变量是用…

【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱7(附带项目源码)

效果演示 文章目录 效果演示系列目录前言新增简单的泛型单例消耗品源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中&#xff0c;我们将探索如何用unity制作一个3D背包、库存、…