题目描述

题目要求将输入文本中的每个单词转换为 Pig Latin\texttt{Pig Latin}Pig Latin。单词定义为连续的字母序列(不区分大小写)。转换规则如下:

  • 若单词以元音字母(a,e,i,o,u\texttt{a,e,i,o,u}a,e,i,o,u 及其大写形式)开头,则在单词末尾添加 ay
  • 若单词以辅音字母开头,则将第一个字母移到单词末尾,再添加 ay
  • 非字母字符(如空格、标点等)原样输出,不进行转换。

输入格式

输入包含多行文本。每行包含任意数量的字符。输入以文件结束符(EOF\texttt{EOF}EOF)终止。

输出格式

输出转换后的文本,保持原空格和标点位置不变。

样例

输入

This is the input.

输出

hisTay isay hetay inputay.

题目分析

本题的核心是逐字符处理输入,识别单词并应用转换规则。

算法步骤

  1. 逐字符读取输入。
  2. 若当前字符是字母,则将其加入当前单词缓冲区。
  3. 若当前字符不是字母:
    • 若缓冲区非空,则对缓冲区中的单词进行转换并输出。
    • 输出当前非字母字符。
    • 清空缓冲区。
  4. 处理完所有字符后,若缓冲区非空,则输出最后转换的单词。

转换规则

  • 判断首字母是否为元音(不区分大小写):
    • 若是,输出原单词后加 ay
    • 若不是,输出原单词去掉首字母后的部分,然后输出首字母,最后加 ay
  • 注意保持原单词的大小写:首字母移动后应保持原有大小写?规则中说明“不改变任何字母的大小写”,因此移动后的首字母应保持原样输出(如样例中 This 变为 hisTay,首字母 T 被移到最后仍为大写)。

复杂度分析

每个字符处理一次,时间复杂度 O(L)O(L)O(L)

代码实现

// Pig-Latin
// UVa ID: 492
// Verdict: Accepted
// Submission Date: 2026-07-08
// UVa Run Time: 0.000s
//
// 版权所有(C)2026,邱秋。metaphysis # yeah dot net

#include <bits/stdc++.h>
using namespace std;

int main(int argc, char *argv[]) {
    ios::sync_with_stdio(false);
    cin.unsetf(ios::skipws);
    char input;
    string block;
    while (cin >> input) {
        if (isalpha(input)) block += input;
        else {
            if (block.length() > 0) {
                char vowel = tolower(block.front());
                if (vowel == 'a' || vowel == 'e' || vowel == 'i' || vowel == 'o' || vowel == 'u') cout << block << "ay";
                else {
                    char front = block.front();
                    block.erase(block.begin());
                    cout << block << front << "ay";
                }
            }
            cout << input;
            block.clear();
        }
    }
    return 0;
}
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐