【GESP】C++三级练习 luogu-B2118 验证子串
GESP三级练习,字符串练习(C++三级大纲中6号知识点,字符串),难度★★☆☆☆。
luogu-B2118 验证子串
题目要求
题目描述
输入两个字符串,验证其中一个串是否为另一个串的子串。
输入格式
两行,每行一个字符串。
输出格式
若第一个串 $s_1$ 是第二个串 $s_2$ 的子串,则输出
(s1) is substring of (s2)
;否则,若第二个串 $s_2$ 是第一个串 $s_1$ 的子串,输出
(s2) is substring of (s1)
;否则,输出
No substring
。
输入输出样例 #1
输入 #1
1
2
abc
dddncabca
输出 #1
1
abc is substring of dddncabca
输入输出样例 #2
输入 #2
1
2
aaa
bbb
输出 #2
1
No substring
说明/提示
对于 $100 \%$ 的数据,字符串长度在 $20$ 以内。
题目分析
解题思路
题目要求规范化药品名称的大小写格式。
- 规范化规则分析:
- 第一个字母需要大写
- 其余字母需要小写
- 数字和特殊字符(如”-“)保持不变
- 具体思路:
- 读入药品数量n和n个药品名
- 对每个药品名进行处理:
- 检查第一个字符,如果是字母则转换为大写
- 将剩余字符中的字母转换为小写
- 数字和特殊字符保持原样
- 输出处理后的结果
- 时间复杂度分析:
- 需要遍历每个药品名的每个字符,O(n*m)
- 其中n为药品数量,m为药品名的最大长度
- 空间复杂度为O(n*m),需要存储n个长度为m的字符串
示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <cstdio>
#include <iostream>
#include <string>
int main() {
// 声明两个字符串变量用于存储输入
std::string str1;
std::string str2;
// 使用getline读取两行输入,每行一个字符串
std::getline(std::cin, str1);
std::getline(std::cin, str2);
// 检查str1是否包含str2
if (str1.find(str2) != std::string::npos) {
// 如果str2是str1的子串,按格式输出结果
printf("%s is substring of %s", str2.c_str(), str1.c_str());
}
// 检查str2是否包含str1
else if (str2.find(str1) != std::string::npos) {
// 如果str1是str2的子串,按格式输出结果
printf("%s is substring of %s", str1.c_str(), str2.c_str());
}
// 如果两个字符串都不是对方的子串
else {
std::cout << "No substring";
}
return 0;
}
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页
“luogu-”系列题目已加入洛谷Java、C++初学团队,作业清单,可在线评测,团队名额有限,欢迎加入。
“bcqm-”系列题目可在编程启蒙题库进行在线评测。
本文由作者按照 CC BY 4.0 进行授权