文章

【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$ 以内。


题目分析

解题思路

  1. 题目要求规范化药品名称的大小写格式。

  2. 规范化规则分析:
    • 第一个字母需要大写
    • 其余字母需要小写
    • 数字和特殊字符(如”-“)保持不变
  3. 具体思路:
    • 读入药品数量n和n个药品名
    • 对每个药品名进行处理:
      • 检查第一个字符,如果是字母则转换为大写
      • 将剩余字符中的字母转换为小写
      • 数字和特殊字符保持原样
    • 输出处理后的结果
  4. 时间复杂度分析:
    • 需要遍历每个药品名的每个字符,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 进行授权