GESP 四级冲刺训练营(1):字符串

GESP 四级冲刺训练营:字符串

  • 一、基本常识
    • 1. 功能函数
    • 2. 注意事项
    • 3. 输入输出
      • 3.1 输入
      • 3.2 输出
  • 二、字符串算法
    • 1. 基础字符串
      • 1.1 回文字符串
      • 1.2 亲朋字符串
    • 2. 尺取法求解
      • 2.1 尺取法公式
      • 2.2 最长小写子串
    • 2.3 尺取法易错
  • 三、拓展习题
    • 1. 相似字符串
    • 2. 两数之和

一、基本常识

1. 功能函数

函数格式返回值功能
lengths.length()字符串的长度返回 s 的长度
finds1.find(s2, pos)第一个字符的下标或者 string::npos找到 s2s1 中第一个字符的下标
inserts1.insert(pos, s2)s1pos 下标位置前插入 s2
erases.erase(pos, len)删除 spos 下标位置开始往后的 len 个字符
replaces1.replace(pos, len, s2)替换 s1pos 下标位置开始往后的 len 个字符替换为 s2
tolowertolower(c)对应小写字符c 变为对应的小写字符
touppertoupper(c)对应大写字符c 变为对应的大写字符
substrs.substr(pos, len)截取的子字符串截取 s1pos 下标开始往后的 len 个字符为子字符串
reverses.reverse(it1, it2)sit1it2 进行翻转

2. 注意事项

  • insert() 在下标之前做插入操作;
  • tolower()toupper() 只能传入字符,不能传入字符串;
  • reverse() 传入的两个参数是迭代器,不是下标;
  • reverse() 使用前需要导入 algorithm 头文件。

3. 输入输出

前情提要:请在所有操作之前确保导入 string 头文件。

3.1 输入

// 无空格输入
string s;
cin >> s;// 有空格输入
string s;
getline(cin, s);

3.2 输出

cout << s;

二、字符串算法

1. 基础字符串

1.1 回文字符串

题目描述

输入一个字符串,输出该字符串是否回文。回文是指顺读和倒读都一样的字符串。

输入格式

输入一行字符串,长度小于 100 100 100

输出格式

如果字符串是回文,输出 yes;否则,输出 no

样例 #1

样例输入 #1

abcdedcba

样例输出 #1

yes

参考答案

方法①:函数求解

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;string s;
string olds;int main()
{cin >> s;olds = s;reverse(s.begin(), s.end());if (olds == s){cout << "yes";}else{cout << "no";}return 0;
}

方法②:逻辑求解

#include <iostream>
#include <string>
using namespace std;string s;
int len;int main()
{cin >> s;len = s.length();for (int i = 0; i <= len/2; i++){if (s[i] != s[len-i-1]){cout << "no";return 0;}}cout << "yes";return 0;
}

1.2 亲朋字符串

题目描述

亲朋字符串定义如下:给定字符串 s s s 的第一个字符的 ASCII 值加第二个字符的 ASCII 值,得到第一个亲朋字符; s s s 的第二个字符加第三个字符得到第二个亲朋字符;依此类推。注意:亲朋字符串的最后一个字符由 s s s 的最后一个字符 ASCII 值加 s s s 的第一个字符的 ASCII 值。

输入格式

输入一行,一个长度大于等于 2 2 2,小于等于 100 100 100 的字符串。

输出格式

输出一行,为变换后的亲朋字符串。输入保证变换后的字符串只有一行。

样例 #1

样例输入 #1

1234

样例输出 #1

cege

参考答案

#include <iostream>
#include <string>
using namespace std;string s;
int len;
string news;int main()
{cin >> s;len = s.length();for (int i = 0; i < len; i++){news += s[i]+s[(i+1)%len];}cout << news;return 0;
}

2. 尺取法求解

2.1 尺取法公式

尺取法一般的定义是:
l: 左指针
r: 右指针
s: 字符串
n: 字符串长度

while (l < n)
{if ((s[r]...) && r < n){r++;}else{ans = max(l-r or l-r-1);l = r+1;r++;}
}

2.2 最长小写子串

经典

题目描述

给定一个由若干大写小写字符组成的字符串 str,现在请你求出 str 中最长的小写子串的长度。如果没有,则输出 0 0 0

输入描述

1 1 1 行,包含一个字符串 str

输出描述

1 1 1 行,包含最长小写子串的长度。

样例1

输入

abcdeACzxc
1

输出

5
1

提示

当串 a 中连续包含串 b 的所有元素时,
a 是串 b 的父串;
b 是串 a 的子串。
例如 abcdefgcde 的子串。

参考答案

#include <iostream>
#include <string>
using namespace std;string s;
int l, r;
int len;
int ans;int main()
{cin >> s;len = s.length();while (l < len){if ((s[r] >= 'a' && s[r] <= 'z') && r < len){r++;}else{ans = max(ans, r-l);l = r + 1;r++;}}cout << ans;return 0;
}

2.3 尺取法易错

  • 注意问题的起始位置和结束位置的解决范围
  • 更新结果到底是 r-l 还是 r-l-1 要分清楚
  • 需要特别处理边界条件
  • 要及时更新指针状态

三、拓展习题

1. 相似字符串

题目描述

对于两个字符串 A A A B B B,如果 A A A 可以通过删除一个字符,插入一个字符,修改一个字符变成 B B B,那么我们说 A A A B B B 是相似的。
比如 apple \texttt{apple} apple 可以通过插入一个字符变成 applee \texttt{applee} applee,可以通过删除一个字符变成 appe \texttt{appe} appe,也可以通过修改一个字符变成 bpple \texttt{bpple} bpple。因此 apple \texttt{apple} apple applee \texttt{applee} applee appe \texttt{appe} appe bpple \texttt{bpple} bpple 都是相似的。但 applee \texttt{applee} applee 并不能 通过任意一个操作变成 bpple \texttt{bpple} bpple,因此它们并不相似。
特别地,两个完全相同的字符串也是相似的。
给定 T T T A , B A,B A,B,请你分别判断它们是否相似。

输入格式

第一行一个正整数 T T T
接下来 T T T 行,每行两个用空格隔开的字符串 A A A B B B

输出格式

对组 A , B A,B A,B,如果他们相似,输出 similar,否则输出 not similar

样例 #1

样例输入 #1

5
apple applee
apple appe
apple bpple
applee bpple
apple apple

样例输出 #1

similar
similar
similar
not similar
similar

提示

对全部的测试数据,保证 1 ≤ T ≤ 100 1 \leq T \leq 100 1T100 A A A B B B 的长度不超过 50 50 50,仅含小写字母。

参考答案

#include <iostream>
#include <string>
#include <cmath>
using namespace std;int T;
string A, B;bool isSimilar(string A, string B)
{// 两者完全相同if (A == B) return true;// 初始化int m = A.length();int n = B.length();int cnt = 0; // 记录变化字符数量int l = 0, r = 0; // 记录插入、删除的位置// 长度差大于1if (abs(m-n) > 1) return false;// 两者长度相等,判断是否只修改了一个字符else if (m - n == 0){for (int i = 0; i < m; i++){if (A[i] != B[i]) cnt++;if (cnt > 1) return false;}}// 两者长度相差1else{// B比A多一个字符,判断是否插入一个字符if (m - n == -1){int i = 0, j = 0;while (i < m){if (A[i] != B[j]){// 记录插入的位置l = i;r = j;// 直接比较后面的字符是否相等while (i < m && j < n){if (A[i] != B[j+1]) return false;i++;j++;}// 如果后面的字符都相等,则必须是A的剩余字符都相等if (i < m) return false;break;}else{i++;j++;}}}// A比B多一个字符,判断是否删除一个字符else{int i = 0, j = 0;while (i < m){if (A[i] != B[j]){// 记录删除的位置l = j;r = i;// 直接比较后面的字符是否相等while (i < m && j < n){if (A[i+1] != B[j]) return false;i++;j++;}// 如果后面的字符都相等,则必须是B的剩余字符都相等if (j < n) return false;break;}else{i++;j++;}}}}return true;
}int main()
{cin >> T;while (T--){cin >> A >> B;cout << (isSimilar(A, B) ? "similar\n" : "not similar\n");}return 0;
}

2. 两数之和

题目描述

给定一个长度为 N N N 的整数数组 n u m s nums nums,以及一个目标值 t a r g e t target target。你需要在数组中找到两个数,使得它们的和等于目标值,并返回这两个数的索引(索引从 1 1 1 开始)。你可以假设只有一组答案。

输入格式

第一行包含两个整数 N N N t a r g e t target target,表示数组的长度和目标值。
第二行包含 N N N 个整数 n u m s 1 , n u m s 2 , . . . , n u m s N nums_1, nums_2, ..., nums_N nums1,nums2,...,numsN,表示数组的元素。

输出格式

输出两个整数 i i i j j j,表示两个数的索引( 1 ≤ i , j ≤ N 1 \leq i, j \leq N 1i,jN i ≠ j i \neq j i=j)。

样例 #1

样例输入 #1

4 9
2 7 11 15

样例输出 #1

1 2

提示

对于所有的测试数据,保证 2 ≤ N ≤ 1 0 4 , − 1 0 9 ≤ n u m s i ≤ 1 0 9 , − 1 0 9 ≤ t a r g e t ≤ 1 0 9 2 \leq N \leq 10^4,-10^9 \leq nums_i \leq 10^9,-10^9 \leq target \leq 10^9 2N104,109numsi109,109target109

参考答案

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;vector<int> findTwoSum(vector<int>& nums, int target)
{int l = 0;int r = nums.size() - 1;while (left < right){int sum = nums[l] + nums[r];if (sum == target){return {l+1, r+1};}else if (sum < target){l++;}else{r--;}}return {};
}int main()
{int N, target;cin >> N >> target;vector<int> nums(N);for (int i = 0; i < N; i++){cin >> nums[i];}sort(nums.begin(), nums.end());vector<int> result = findTwoSum(nums, target);cout << result[0] << " " << result[1];   return 0;
}

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

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

相关文章

构建sqli-labs学习环境与掌握SQL注入技术教程

根据提供的文档内容&#xff0c;以下是关于安装sqli-labs学习环境和SQLI-LABS教学的详细步骤和知识点&#xff1a; 安装sqli-labs学习环境 环境准备 操作系统&#xff1a;CentOS 7.6主机名&#xff1a;xuegod63IP地址&#xff1a;192.168.1.63 关闭防火墙和SELinux 禁用并…

sharded jedis pipelined 执行后 数据并未存入redis

前言 因为历史原因&#xff0c;在某个同步菜单操作的方法中先清除缓存&#xff0c;然后在初始化缓存。本来很正常的逻辑&#xff0c;但是这个清除是db查询获取所有的菜单 然后循环一条条删除 然后在db查询有效的菜单操作 在循环一条条插进去 经统计这个菜单操作大概有个7千个 …

深度学习之基于MTCNN+Facenet的人脸识别身份认证系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 随着信息技术的快速发展&#xff0c;身份认证技术在日常生活和工作中的重要性日益凸显。传统的…

TCP/UDP的连接机制

TCP/UDP的连接机制 TCP的连接机制 TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接的协议&#xff0c;提供可靠的、按顺序的数据传输服务。TCP的连接机制包括连接建立、数据传输和连接终止。 1. 连接建立&#xff08;三次握手&#xff09; TCP通过…

民国漫画杂志《时代漫画》第19期.PDF

时代漫画19.PDF: https://url03.ctfile.com/f/1779803-1248634637-c04860?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

使用vue和element_ui搭建后端页面

使用vue和element_ui搭建后台管理页面 效果顶部和左侧内容固定&#xff0c;中间内容滚动 <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&g…

汽车生产线中的工业机器人应用HT3S-PNS-ECS(EtherCAT/Profinet)协议转换通讯方案案例分析

汽车生产线中的工业机器人应用HT3S-PNS-ECS(EtherCAT/Profinet)协议转换通讯方案案例分析 ——北京中科易联科技有限公司供稿—— 一、摘要 随着工业自动化的快速发展&#xff0c;汽车生产线对工业机器人的依赖日益增加。HT3S-PNS-ECS作为工业机器人中的关键组件&#xff0c;其…

GPIO模拟spi时序点亮数码管

目录 spi.h spi.c main.c 实验效果 spi.h #ifndef __SPI_H__ #define __SPI_H__#include "stm32mp1xx_gpio.h" #include "stm32mp1xx_rcc.h"//spi初始化 void spi_init(); //spi写入数据 void spi_write(unsigned char data);#endif spi.c #include…

c++和Lua交互

lua vm Lua VM&#xff08;虚拟机&#xff09;是指运行Lua脚本的执行环境。Lua VM负责将Lua脚本编译成中间代码&#xff0c;然后将该中间代码解释执行或者编译成本地代码执行。在虚拟机之外&#xff0c;Lua的脚本代码并不能直接被计算机指令执行。因此&#xff0c;必须有想办法…

git分支常用命令

最近在用git提交代码的时候&#xff0c;发现有些命令不是很会&#xff0c;先记录几个常用分支命令&#xff0c;后续再补充&#xff0c;在执行git push命令提交代码的时候遇到报错&#xff0c;一并记录下。 1.git常用命令 新建分支&#xff1a; git branch <分支名称> 比…

Vue3组件通讯有哪些方式

目前最常用是props/$emit 和 vuex/pinia ,接下来是 provide/inject,其他不建议使用; 实际项目中&#xff0c;简单父子组件传递采用props/$emit &#xff0c;涉及全局共享的数据一般采用 vuex/pinia 结合存储对象localStorage/sessionStorage使用 1.props/$emit 1.props 单向数…

Python——基于共享单车使用量数据的可视化分析(1)

目录 &#x1f9fe; 1、数据集&#xff08;部分数据&#xff09; ✏️ 2、导入数据集与必要模块 1️⃣ 2.1 导入库以及字体包 2️⃣ 2.2 读取数据集 3️⃣ 2.3 查看数据集基本信息 ⌨️ 3、数据预处理 1️⃣ 3.1删除无关字段 2️⃣ 3.2对各字段进行中文标识 3️⃣ 3.3…

Open3D-Geometry-3:RGBD图像的数据处理

文章目录 0. 引言1. Redwood 数据集2. SUN 数据集3. NYU 数据集4. TUM 数据集0. 引言 Open3D 有图像的数据结构。它支持各种功能,例如read_image、write_image、filter_image和draw_geometries。 Open3D 图像可以直接与 numpy 数组相互转换。 Open3D RGBDImage由两个图像组成…

EI会议的社交活动有哪些?

EI会议&#xff08;Engineering Index会议&#xff09;不仅是一个展示最新研究成果的平台&#xff0c;也为与会者提供了丰富的社交活动机会。以下是一些常见的社交活动形式及其内容&#xff1a; 常见社交活动 1. 欢迎酒会&#xff08;Welcome Reception&#xff09; 时间和地…

图像超分辨率重建相关概念、评价指标、数据集、模型

1、图像超分辨率概念 1.1 基本定义 超分辨率&#xff08;Super-Resolution&#xff09;&#xff0c;简称超分&#xff08;SR&#xff09;。是指利用光学及其相关光学知识&#xff0c;根据已知图像信息恢复图像细节和其他数据信息的过程&#xff0c;简单来说就是增大图像的分辨…

【openpcdet中yaml文件的MODEL学习】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、代码二、详细解释MODEL: NAME: PointPillarMAP_TO_BEV (Mapping to Birds Eye View):BACKBONE_2D (2D Backbone Network): 总结 前言 提示&#xff1a;这里…

光照模型技术在AI去衣中的重要作用

引言&#xff1a; 在数字图像处理和计算机视觉领域&#xff0c;AI去衣技术正逐渐成为研究和应用的热点。这项技术依赖于人工智能算法&#xff0c;尤其是深度学习模型&#xff0c;来识别和处理图像或视频中的衣物。在这个过程中&#xff0c;光照模型技术扮演着至关重要的角色。本…

派可数据助力制造企业数字化生产管理新能力提升

生产管理是现代企业运营的核心之一&#xff0c;它决定了产品的质量、生产效率和企业的竞争力。在一个日益竞争激烈、市场需求多变的商业环境中&#xff0c;如何高效地组织和管理生产过程成为了企业不容忽视的重要课题。 过去&#xff0c;生产管理可能主要侧重于物理工厂的运作…

2024-5-6-从0到1手写配置中心Config之实现配置中心客户端

配置加载原理 在Spring中PropertySource类实现了所有属性的实例化。 启动赋值&#xff1a; 定义自定义属性配置源&#xff0c;从config-server获取全局属性&#xff1b;Spring启动时&#xff0c;插入自定义属性配置源&#xff1b;绑定属性会优先使用&#xff0c;给自定义属性…

宁盾与深信服发布联合方案,解决云桌面及微软AD完整替代

自 Citrix 退出中国市场后&#xff0c;不少中大型企业关心国产云桌面脱离微软 AD 域是否还能正常工作。在2024年3月初&#xff0c;宁盾身份目录与深信服桌面云完成兼容互认证&#xff0c;对于企业的疑问给出了官方回应。 5月10日&#xff0c;在深信服《Citrix离场背景下&#…