文章

【GESP】C++三级练习 luogu-B2119 删除单词后缀

GESP三级练习,字符串练习(C++三级大纲中6号知识点,字符串),难度★★☆☆☆。

luogu-B2119 删除单词后缀

题目要求

题目描述

给定一个单词,如果该单词以 erly 或者 ing 后缀结尾,则删除该后缀(题目保证删除后缀后的单词长度不为 $0$),否则不进行任何操作。

输入格式

输入一行,包含一个单词(单词中间没有空格,每个单词最大长度为 $32$)。

输出格式

输出按照题目要求处理后的单词。

输入输出样例 #1

输入 #1

1
referer

输出 #1

1
refer

题目分析

解题思路

  1. 题目要求判断单词是否以特定后缀(er、ly、ing)结尾,并删除这些后缀。

  2. 解题思路分析:
    • 需要判断字符串末尾是否匹配指定的后缀
    • 使用字符串的截取功能来获取和比较后缀
    • 分四种情况处理输出结果:er结尾、ly结尾、ing结尾、其他
  3. 具体思路:
    • 读入一个字符串word
    • 使用string的substr函数检查后缀:
      • 检查是否以”er”结尾
      • 检查是否以”ly”结尾
      • 检查是否以”ing”结尾
      • 如果都不是,保持原样
    • 根据后缀情况截取并输出结果
  4. 时间复杂度分析:
    • string的substr函数时间复杂度为O(k),k为截取长度
    • 总体时间复杂度为O(1),因为只需要检查固定长度的后缀
    • 空间复杂度为O(n),其中n为输入字符串的长度


示例代码

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
#include <iostream>
#include <string>

int main() {
    // 定义字符串变量用于存储输入的单词
    std::string str;
    // 从标准输入读取单词
    std::cin >> str;
    // 判断单词是否以"er"或"ly"结尾
    if (str.substr(str.length() - 2, str.length()) == "er" ||
        str.substr(str.length() - 2, str.length()) == "ly") {
        // 如果是,删除最后两个字符并输出
        std::cout << str.substr(0, str.length() - 2) << std::endl;
    } 
    // 判断单词是否以"ing"结尾
    else if (str.substr(str.length() - 3, str.length()) == "ing") {
        // 如果是,删除最后三个字符并输出
        std::cout << str.substr(0, str.length() - 3) << std::endl;
    } 
    // 如果不是以上任何后缀结尾
    else {
        // 直接输出原单词
        std::cout << str;
    }
    return 0;
}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页

luogu-”系列题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限,欢迎加入。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

本文由作者按照 CC BY 4.0 进行授权