检查单词末尾是否命中 er/ly/ing 后缀,命中则删除并输出,否则原样输出。
OJ: roj
题目 ID: 1141
难度:入门
标签:字符串模拟
创建: 2026-09-29 20:38
更新: 2026-10-05 03:21
题目描述
给定一个单词(不含空格,长度不超过 32)。若它以 er、ly 或 ing 结尾,则删除该后缀(保证删除后长度不为 0);否则不操作。输出处理后的单词。
输入一行一个单词;输出一行处理后的单词。
思路
把三个后缀放进数组,依次比较单词末尾是否匹配,命中即用 \0 截断。因三个后缀末字符各不相同,最多命中一个,判断顺序不影响结果。
参考代码
Python 版:
python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-29 20:38
# update_at: 2026-10-04 14:27
import sys
# 题面给的三种后缀,按题面顺序排列;删除后单词长度不为 0,所以单词不会就是后缀本身
SUFFIXES = ("er", "ly", "ing")
def solve() -> None:
"""读入一个单词,命中 er / ly / ing 后缀就删掉,否则原样输出。"""
data = iter(sys.stdin.buffer.read().split())
word = next(data).decode()
# 三个后缀的末尾两字符分别是 er / ly / ng,互不相同,因此最多命中一个,顺序无关
suffix = next((tail for tail in SUFFIXES if word.endswith(tail)), "")
print(word.removesuffix(suffix)) # 后缀为空串时 removesuffix 原样返回,省掉 if-else
if __name__ == "__main__":
solve()C++ 版(同一算法):
cpp
/**
* Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
* rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
* rainboy的学习导航网站: https://idx.roj.ac.cn
* create_at: 2026-10-05 03:21
* update_at: 2026-10-05 03:21
*/
#include <bits/stdc++.h>
using namespace std;
char s[40]; // 输入单词,长度不超过 32
const char *suffixes[] = {"er", "ly", "ing"}; // 题面给定的后缀集合
int main() {
scanf("%s", s);
int n = strlen(s); // 当前单词长度
// 依次检查三个后缀,命中则删除并输出
for (int i = 0; i < 3; i++) {
int len = strlen(suffixes[i]);
if (n >= len && strcmp(s + n - len, suffixes[i]) == 0) {
s[n - len] = '\0';
break;
}
}
printf("%s\n", s);
return 0;
}