Skip to content

喵哈喽~!各位程序员哥哥姐姐们,我是你们的小助手猫娘~ ฅ^•ﻌ•^ฅ

今天我们来看一道超级基础的字符串处理题哦,Codeforces 上的 118A - String Task。这道题非常适合刚开始学习编程和算法的同学用来练手,可以很好地熟悉字符串的基本操作呢。

那么,就让本猫娘带你一步步把这道题轻松解决掉吧!

题目大意

这道题呀,就像是给一个字符串做一次“大扫除”和“化妆”一样,喵~

我们需要对一个只包含大小写拉丁字母的输入字符串,进行以下三步操作:

  1. 删除所有的元音字母 (Vowels)
    • 注意哦,题目特别指定了元音是 'A', 'O', 'Y', 'E', 'U', 'I' 这几个字母,以及它们对应的小写形式。
  2. 在每个辅音字母 (Consonants) 前面加上一个 . 字符
    • 除了上面提到的元音,剩下的就都是辅音啦。
  3. 把所有的大写辅音字母都变成小写

最后,把处理完的字符串输出出来就好啦。

举个例子,如果输入的字符串是 tour

  • t 是辅音,变成 .t
  • o 是元音,删掉
  • u 是元音,删掉
  • r 是辅音,变成 .r 所以最后的结果就是 .t.r。是不是很简单喵?

题解方法

既然规则这么清晰,那我们的思路也很直接喵!就是把输入的字符串从头到尾扫一遍,一个一个字符地检查和处理。

  1. 遍历字符串:首先,我们需要一个循环,来依次拿到输入字符串里的每一个小字符。

  2. 统一大小写:不管是大写字母还是小写字母,判断起来有点麻烦。一个聪明的办法是,先把当前拿到的字符,不管三七二十一,全都转换成小写!这样做有两大好处:

    • 后面判断是不是元音时,我们只需要判断它是不是 'a', 'o', 'y', 'e', 'u', 'i' 这六个小写字母就行了,大大简化了判断逻辑。
    • 这也顺便满足了题目的第三个要求——“把所有大写辅音变成小写”。因为无论是元音还是辅音,我们都把它变小写了,最后留下的辅音自然就是小写的啦。
  3. 判断与操作:现在每个字符都是小写的了,我们来判断它是什么。

    • 如果是元音 ('a', 'o', 'y', 'e', 'u', 'i' 之一),根据规则一,我们就直接把它丢掉,什么都不做,就像小猫不理睬不喜欢的玩具一样,跳到下一个字符就好啦。
    • 如果不是元音,那它肯定就是辅音了!根据规则二和规则三,我们就要先在一个新的结果字符串里加上一个 .,再把这个小写辅音加上去。
  4. 拼接结果:我们可以准备一个空的新字符串,在遍历过程中,把每次处理得到的字符(比如 .t)一点点地拼接到它的末尾。当遍历完所有输入字符后,这个新字符串就是我们想要的最终答案啦!


题解

下面就是用 C++ 实现的完整代码啦,本猫娘加上了详细的注释,方便你理解每一句都在做什么哦!

cpp
#include <iostream> // 用来处理输入输出,比如 cin 和 cout
#include <string>   // 用来使用 std::string 这个好用的字符串类型
#include <cctype>   // 里面有 tolower 这样的字符处理魔法哦

int main() {
    // 这两行是加速咒语!可以让 cin 和 cout 跑得更快,在比赛里很有用,喵~
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(NULL);

    // 读入题目给的字符串
    std::string input_str;
    std::cin >> input_str;

    // 准备一个空盘子...啊不,是空字符串,用来装我们处理好的结果
    std::string result_str;
    
    // 一个小优化:提前预留好空间,避免字符串在拼接时反复重新分配内存
    // 最坏情况是所有字母都是辅音,结果长度是原长的2倍
    result_str.reserve(2 * input_str.length());

    // 开始遍历输入的字符串,ch 就是我们当前抓到的小字符
    for (char ch : input_str) {
        // 用 tolower() 魔法把当前字符 ch 变成小写,存到 lower_ch 里
        char lower_ch = std::tolower(ch);

        // 这里就是一个长长的判断啦,看看 lower_ch 是不是元音。
        // 我们用 != (不等于) 和 && (并且) 来检查它是不是所有元音之外的字母。
        if (lower_ch != 'a' && lower_ch != 'o' && lower_ch != 'y' &&
            lower_ch != 'e' && lower_ch != 'u' && lower_ch != 'i') {
            
            // 如果不是元音,那就是辅音啦!
            // 在结果字符串后面加上一个点点 '.'
            result_str += '.';
            // 再跟上这个小写辅音
            result_str += lower_ch;
        }
        // 如果是元音,if 条件不成立,就什么也不做,直接进入下一次循环,效果就是把它删掉了~
    }

    // 最后,把我们精心制作好的结果字符串打印出来就大功告成啦!
    std::cout << result_str << std::endl;

    return 0;
}

知识点介绍

这道题虽然简单,但是涉及到的知识点都是编程中非常核心和常用的哦!

  1. C++ 字符串 (std::string)std::string 是 C++ 标准库里处理字符串的超级好用的工具!它可以很方便地读取、用 += 拼接、以及遍历。相比 C 语言的字符数组,std::string 更安全,功能也更强大,是现代 C++ 编程的首选,喵~

  2. 范围 for 循环 (Range-based for loop) 代码里用到的 for (char ch : input_str) 是一种很现代的 C++ 循环写法。它可以自动地、安全地遍历一个容器(比如 std::string)里的所有元素,我们不需要关心下标和边界,写起来又短又清晰,还能有效避免一些常见的循环错误。

  3. 字符处理函数 (<cctype>)<cctype> 这个头文件里有很多处理字符的“小魔法”。这次我们用到的 std::tolower() 就是其中之一,它可以把一个大写字母字符转换成对应的小写形式。它的好搭档是 std::toupper(),用来转大写。善用这些函数能让你的代码更简洁。

  4. I/O 优化 (Fast I/O) 在竞技编程中,当输入输出数据量很大时,cincout 可能会因为一些内部同步机制而变慢。std::ios_base::sync_with_stdio(false);std::cin.tie(NULL); 这两行代码可以解除这种同步,大幅提升读写速度。虽然这道题数据量不大,感觉不明显,但养成这个好习惯对付更难的题目很有帮助哦!

好啦,这次的题解就到这里啦!是不是感觉很简单呢?多多练习,你也能成为字符串处理大师的!下次再见喵~ (ฅ'ω'ฅ)

Released under the MIT License.