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.hqwc.cn/news/471871.html

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

相关文章

英文单词-计算:Calculate与Compute的区别是什么

英文单词-计算:Calculate与Compute的区别是什么 compute 源自法语&#xff1b;calculate 源自拉丁语。在使用上&#xff0c;calculate 使用得更为广泛 calculate侧重人的分析&#xff0c;而compute侧重机器的运算。 calculator是“计算器”&#xff0c;而computer是“计算机”…

爬虫之牛刀小试(十一):爬取某东关于手机的评论

首先我们进入华为官方旗舰店&#xff0c;点击Mate60&#xff0c;得到&#xff1a; 找到存放评论的接口网址&#xff1a; 然后使用cookie模拟登录&#xff0c;得到字典筛选出我们想要的内容。 爬取1000条评论 同样可以对任意商品进行操作&#xff0c;得到16款手机共计16000…

Java使用opencsv完成对csv批量操作

文章目录 前言一、maven二、造数三、代码部分1.OpenCsvController2.OpenCsvUtil3.StudentInfo4.CodeToValue 三、效果展示1.download2.upload 总结 前言 csv文件是不同于excel文件的另一种文件&#xff0c;常常以,作为分隔符&#xff0c;本篇将通过JavaBean的形式完成对csv文件…

2024.2.15 模拟实现 RabbitMQ —— 消息持久化

目录 引言 约定存储方式 消息序列化 重点理解 针对 MessageFileManager 单元测试 小结 引言 问题&#xff1a; 关于 Message&#xff08;消息&#xff09;为啥在硬盘上存储&#xff1f; 回答&#xff1a; 消息操作并不涉及到复杂的增删查改消息数量可能会非常多&#xff…

【机器学习笔记】8 决策树

决策树原理 决策树是从训练数据中学习得出一个树状结构的模型。 决策树属于判别模型。 决策树是一种树状结构&#xff0c;通过做出一系列决策&#xff08;选择&#xff09;来对数据进行划分&#xff0c;这类似于针对一系列问题进行选择。决策树的决策过程就是从根节点开始&…

心理辅导|高校心理教育辅导系统|基于Springboot的高校心理教育辅导系统设计与实现(源码+数据库+文档)

高校心理教育辅导系统目录 目录 基于Springboot的高校心理教育辅导系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、学生功能模块的实现 &#xff08;1&#xff09;学生登录界面 &#xff08;2&#xff09;留言反馈界面 &#xff08;3&#xff09;试卷列表界…

Java实现实现自动化pdf打水印小项目 使用技术pdfbox、Documents4j

文章目录 前言源码获取一、需求说明二、 调研pdf处理工具word处理工具 三、技术栈选择四、功能实现实现效果详细功能介绍详细代码实现项目目录WordUtilsMain类实现部分&#xff1a;第一部分Main类实现部分&#xff1a;第二部分Main类实现部分&#xff1a;第三部分 资料获取 前言…

win7自带截图工具保存失效解决办法

今日发现一台远航技术的win7中自带的截图工具使用时正常&#xff0c;保存图片时没有弹出保存位置的对话窗口&#xff0c;无法正常保存图片。解决方案如下&#xff1a; 1、进入注册表编辑器。开始-搜索程序和文件-输入 regedit 按下回车键&#xff0c;打开注册表&#xff1b; 2、…

DS Wannabe之5-AM Project: DS 30day int prep day18

Q1. What is Levenshtein Algorithm? Levenshtein算法&#xff0c;也称为编辑距离算法&#xff0c;是一种量化两个字符串之间差异的方法。它通过计算将一个字符串转换成另一个字符串所需的最少单字符编辑操作次数来实现。这些编辑操作包括插入、删除和替换字符。Levenshtein距…

【知识图谱--第三讲知识图谱的存储与查询】

知识图谱的存储与查询 基于关系型数据库的知识图谱存储基于原生图数据库的知识图谱存储原生图数据库实现原理浅析 基于关系型数据库的知识图谱存储 基于原生图数据库的知识图谱存储 原生图数据库实现原理浅析

黑群晖一键修复:root、AME、DTS、转码、CPU型号等

食用方法&#xff1a;SSH连接群晖使用临时root权限执行 AME3.x激活补丁 只适用于x86_64的&#xff1a;DSM7.x Advanced Media Extensions (AME)版本3.0.1-2004、3.1.0-3005 激活过程需要下载官方的解码包&#xff0c;过程较慢&#xff0c;耐心等待。。。 DSM7.1和7.2的AME版…

CMake进行C/C++与汇编混合编程

1. 前提 这篇文章记录一下怎么用CMake进行项目管理, 并用C/C和汇编进行混合编程, 为了使用这项技术, 必须在VS的环境中安装好cmake组件 由于大部分人不会使用C/C与汇编进行混合编程的情况。所以这篇文章并不适用于绝大部分人不会对其中具体细节进行过多叙述。只是做一些简单的…