题目描述
题目要求将输入文本中每个单词的字母顺序反转,同时保持单词之间的顺序和空白字符不变。单词是由可打印字符组成的连续序列,由空白字符分隔。
输入格式
输入包含若干行,每行包含若干个单词(由空白字符分隔)。输入以文件结束符(EOF\texttt{EOF}EOF)终止。
输出格式
输出与输入相同的行数和单词顺序,但每个单词内的字母顺序反转。
样例
输入
I love you. You love me. We're a happy family.输出
I evol .uoy uoY evol .em er'eW a yppah .ylimaf题目分析
本题的核心是逐行处理输入,识别出每个单词并反转其字母顺序,同时保留空白字符。
算法步骤
- 逐行读取输入。
- 遍历行中的每个字符:
- 若字符为空白字符(空格、制表符等),直接输出。
- 若字符为非空白字符,则收集连续的单词字符,反转后输出。
- 输出换行。
注意点
- 标点符号(如句点、逗号等)被视为单词的一部分,需要一起反转。
- 单词边界由空白字符决定(包括空格、制表符等)。
- 保留原始空白字符的个数和类型。
复杂度分析
每个字符处理一次,时间复杂度O(L)O(L)O(L),LLL为输入总长度。
代码实现
// Word Scramble// UVa ID: 483// Verdict: Accepted// Submission Date: 2016-07-13// UVa Run Time: 0.000s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;intmain(){ios::sync_with_stdio(false);string line;while(getline(cin,line)){intindex=0;while(index<line.length()){if(isblank(line[index]))cout<<line[index];else{string block;while(index<line.length()&&isblank(line[index])==false){block+=line[index];index++;}reverse(block.begin(),block.end());cout<<block;continue;}index++;}cout<<endl;}return0;}