信息学奥赛第二节 —— 字符串2(s.find() + s.substr() + s.erase() + s.insert() + s.replace())

本文主要是介绍信息学奥赛第二节 —— 字符串2(s.find() + s.substr() + s.erase() + s.insert() + s.replace()),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

接上次文章,以一道例题开始本文。本题需要读者自行了解一下什么是字典序。在这里简单介绍一下字典序的比较:hello > hellhello < hellp

练习1 原题链接

题目描述

编写程序,针对输入的N个不同的字符串,输出其中字典码最小的字符串。

输入

输入第一行给出正整数N;随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行符,空格,制表符。

输出

输出字典码最小的字符串

样例输入

5
Li
Wang
Zha
Jin
Xian

样例输出

Jin

解题思路:C++中的string类可以直接进行字符串的比较,故建议直接使用'>'、'<'来进行字符串的比较。先输入第一个字符串S1,再输入剩下的字符串S2...Sn,每次输入Si之后都将其与第一个字符串进行比较,若小于第一个字符串,就将其复制给第一个字符串S1,最后输出S1即可。
AC代码

#include <iostream>
#include <string>using namespace std;int main()
{int n; cin >> n;//输入组数string s1; cin >> s1;//输入第一个字符串int x = n - 1;//输入剩下的n - 1个字符while (x--){string s; cin >> s;if (s < s1) s1 = s;}cout << s1 << endl;//s1保存字典序最小的那个字符串return 0;
}
字符串中常见的函数

查找、截取:

  • find(sub) —— 查找字符串中子串sub第一次出现的下标,如果没有,则返回-1
  • find(sub,x) —— 从下标x开始查找子字符串sub
  • substr(i,len) —— 从下标i开始,截取长度为len的子串
  • substr(i) —— 从下标i开始截取子串,截取到最后

插入、删除、替换:

  • erase(i,len) —— 从下标i开始删除长度为len个字符
  • erase(i) —— 从下标i开始删除下标i之后的所有字符
  • insert(i,sub) —— 在下标为i的位置插入一个字符串sub
  • replace(i,len,,str) —— 从下标i开始,将其后len个长度的字符替换为str
举例说明

s.find(sub)

#include <iostream>
#include <string>using namespace std;int main()
{string s = "hello world";string x = "world";int p = s.find(x);//在字符串s中查找子串x,若没有则返回-1cout << p << endl;//6return 0;
}

substr(i,len)截取world

#include <iostream>
#include <string>using namespace std;int main()
{string s = "hello world";string x = "world";//第一种方法:string res1 = s.substr(6,5);//从字符串s第6个位置开始,向后截取5个字符cout << res1 << endl;//world//第二种方法:int p = s.find(" ");//先找到字符串s中空格的位置string res2 = s.substr(p + 1,5);//从p + 1位置开始,向后截取5个字符cout << res2 << endl;//world//第三种方法:string res3 = s.substr(6);//从第6个位置开始截取到最后cout << res3 << endl;//worldreturn 0;
}

s.erase、s.insert、s.replace:

#include <iostream>
#include <string>using namespace std;int main()
{string s = "this is a phone";string res1 = s.substr(5,2);//截取iscout << res1 << endl;s.erase(5,3);//删除iscout << s << endl;s.insert(5,"is ");//插入iscout << s << endl;s.replace(10,5,"book");//替换phone为bookcout << s << endl;return 0;
}

输出:

is
this a phone
this is a phone
this is a book

练习2 原题链接

题目描述

请问在一个父字符串s中是否存在子字符串t。如果存在,则输出子字符串t在父字符串中所有的起始位置,如果不存在,则输出-1。
比如:假设父字符串s = “Go Abc good goole!”,子字符串t = “go”,那么输出位置:
8
13
再比如:假设父字符串s = “Go Abc good goole!”,子字符串t = “hi”,那么输出结果:-1。

输入

第一行输入父字符串的值;
第二行输入子字符串的值;

输出

输出子字符串在父字符串中所有的位置,如果父字符串中不存在子字符串,请输出-1。

样例输入

Go Abc good goole!
go

样例输出

8
13

解题思路:本题可以使用KMP算法来解决。也可以使用上面介绍的几种字符串函数搭配while循环来实现。需要注意的是:在while循环中,如果写成pos = s.find(t,pos);则会TLE
AC代码

#include <iostream>
#include <string>using namespace std;int main()
{string s,t;//s代表子串,t代表模式串getline(cin,s);getline(cin,t);int pos = s.find(t);if (pos == -1) cout << -1 << endl;//子串不存在else//pos != -1:子串存在 {while (pos != -1) {cout << pos + 1 << endl;//题目中下标从1开始pos = s.find(t,pos + 1);//从pos + 1的位置开始继续搜索}}return 0;
}
练习3 原题链接

题目描述

从键盘输入一个字符串str和一个字符c,删除str中的所有字符c并输出删除后的字符串str。

输入

第一行是一个字符串; (不含空格)
第二行是一个字符。

输出

删除指定字符后的字符串。

样例输入
在这里插入图片描述
样例输出

sdfsdf

AC代码

#include <iostream>
#include <string>using namespace std;int main()
{string s; char c;//读入字符串以及字符getline(cin,s); cin >> c;int p = s.find(c);//先在字符串中找到第一个目标字符出现的位置while (p != -1){s.erase(p,1);//删除字符p = s.find(c);//更新p的位置}cout << s << endl;return 0;
}

本题的易错点:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>using namespace std;int main()
{string s; getline(cin,s);char c; cin >> c;int len = s.size();for (int i = 0 ;i < len;i++)if (s[i] == c) s.erase(i,1);cout << s << endl;return 0;
}

以上代码是错误的,原因是s.erase(i,1); 这个是函数,erase删除之后这个字符串的长度就变了。所以正确的思路是每次查找要删除的字符的位置,然后删除,直到找不到为止。

这篇关于信息学奥赛第二节 —— 字符串2(s.find() + s.substr() + s.erase() + s.insert() + s.replace())的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/591544

相关文章

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

python修改字符串值的三种方法

《python修改字符串值的三种方法》本文主要介绍了python修改字符串值的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录第一种方法:第二种方法:第三种方法:在python中,字符串对象是不可变类型,所以我们没办法直接

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

生信代码入门:从零开始掌握生物信息学编程技能

少走弯路,高效分析;了解生信云,访问 【生信圆桌x生信专用云服务器】 : www.tebteb.cc 介绍 生物信息学是一个高度跨学科的领域,结合了生物学、计算机科学和统计学。随着高通量测序技术的发展,海量的生物数据需要通过编程来进行处理和分析。因此,掌握生信编程技能,成为每一个生物信息学研究者的必备能力。 生信代码入门,旨在帮助初学者从零开始学习生物信息学中的编程基础。通过学习常用

生信圆桌x生信分析平台:助力生物信息学研究的综合工具

介绍 少走弯路,高效分析;了解生信云,访问 【生信圆桌x生信专用云服务器】 : www.tebteb.cc 生物信息学的迅速发展催生了众多生信分析平台,这些平台通过集成各种生物信息学工具和算法,极大地简化了数据处理和分析流程,使研究人员能够更高效地从海量生物数据中提取有价值的信息。这些平台通常具备友好的用户界面和强大的计算能力,支持不同类型的生物数据分析,如基因组、转录组、蛋白质组等。

C和指针:字符串

字符串、字符和字节 字符串基础 字符串就是一串零个或多个字符,并且以一个位模式为全0的NUL字节结尾。 字符串长度就是字符串中字符数。 size_t strlen( char const *string ); string为指针常量(const修饰string),指向的string是常量不能修改。size_t是无符号数,定义在stddef.h。 #include <stddef.h>

PHP字符串全排列

方法一: $str = 'abc';$a =str_split($str);perm($a, 0, count($a)-1);function perm(&$ar, $k, $m) {if($k == $m){ echo join('',$ar), PHP_EOL;}else {for($i=$k; $i<=$m; $i++) {swap($ar[$k], $ar[$i]);perm($ar