【2025刷题笔记】- 单词倒序
刷题笔记合集🔗
单词倒序
问题描述
输入单行英文句子,里面包含英文字母、空格以及
三种标点符号,请将句子内每个单词进行倒序,并输出倒序后的语句。
输入格式
输入字符串 ,
的长度满足
。
输出格式
输出倒序后的字符串。
样例输入
yM eman si boB.
woh era uoy ? I ma enif.
样例输出
My name is Bob.
how are you ? I am fine.
数据范围
| 样例 | 解释说明 |
|---|---|
| 样例1 | 将"yM"倒序为"My","eman"倒序为"name","si"倒序为"is","boB"倒序为"Bob",注意标点符号"."位置不变。 |
| 样例2 | 将每个单词进行倒序,标点符号"?"和"."位置不变。 |
- 标点符号左右的空格
,单词间空格
- 输入字符串长度满足
题解
这道题要求将句子中的每个单词倒序输出,同时保持标点符号和空格的位置不变。
解决这个问题的关键是识别出句子中的每个单词,然后对每个单词单独进行倒序处理。有两种主要的解决方案:
方法一:逐字符处理
- 定义分隔符集合(空格和三种标点符号)
- 遍历字符串,记录所有分隔符的位置(包括开头和结尾)
- 对于相邻两个分隔符之间的字符序列(即单词),进行倒序处理
- 拼接处理后的结果
这种方法的优点是直观明了,能够精确控制每个字符的处理。
方法二:正则表达式替换
对于支持正则表达式的语言,可以直接使用正则表达式匹配所有单词,然后将每个匹配到的单词进行倒序替换:
- 使用正则表达式匹配连续的英文字母(即单词)
- 对每个匹配到的单词进行倒序
- 用倒序后的单词替换原单词
这种方法代码简洁,但需要理解正则表达式。
时间复杂度:O(n),其中n是字符串的长度,我们只需要遍历一次字符串。 空间复杂度:O(n),需要存储处理后的结果。
对于这道题来说,两种方法都能高效地解决问题。考虑到输入字符串的长度限制在100以内,任何合理的实现都能快速得到结果。
参考代码
- Python
import sys
import re
input = lambda:sys.stdin.readline().strip()
# 读取输入
s = input()
# 方法一:使用正则表达式替换
def reverse_words_regex(s):
# 定义一个函数来处理每个匹配的单词
def reverse_word(match):
# 获取匹配的单词并倒序
word = match.group(0)
return word[::-1]
# 使用正则表达式匹配单词并替换
# [a-zA-Z]+ 匹配一个或多个英文字母
return re.sub(r'[a-zA-Z]+', reverse_word, s)
# 方法二:逐字符处理
def reverse_words_manual(s):
# 定义分隔符
delimiters = {' ', ',', '.', '?'}
# 记录分隔符位置
positions = [-1] # 开始位置
for i in range(len(s)):
if s[i] in delimiters:
positions.append(i)
positions.append(len(s)) # 结束位置
# 处理每个单词
result = list(s) # 转换为字符列表以便修改
for i in range(len(positions) - 1):
start = positions[i] + 1
end = positions[i + 1] - 1
# 如果start>end,说明是连续的分隔符
if start <= end:
# 反转单词
word = result[start:end+1]
word.reverse()
result[start:end+1] = word
return ''.join(result)
# 使用正则表达式方法处理并输出结果
print(reverse_words_regex(s))
- Cpp
#include <bits/stdc++.h>
using namespace std;
// 判断字符是否为分隔符
bool is_delimiter(char c) {
return c == ' ' || c == ',' ||
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
算法刷题笔记 文章被收录于专栏
本专栏收集并整理了一些刷题笔记


查看5道真题和解析