1 条题解

  • 0
    @ 2025-5-25 21:08:16

    题解:复数形式转换

    题目分析

    本题要求根据给定规则将单词转换为复数形式。规则分为四类:不规则单词直接替换、辅音+y结尾的单词转换、特定后缀(o/s/ch/sh/x)加es、其他情况加s。需要依次判断每个单词符合的规则,进行相应转换。

    解题思路

    1. 不规则单词处理:使用结构体数组存储不规则单词及其复数形式,通过遍历数组匹配单词,直接返回对应的复数形式。
    2. 规则单词处理
      • 判断后缀长度:对于需要检查双字符后缀(如ch/sh)的情况,先确保单词长度足够(至少2个字符)。
      • 辅音+y结尾:检查最后一个字符是否为'y',且前一个字符是否为辅音(非元音字母a/e/i/o/u)。
      • 特定后缀(o/s/x/ch/sh):直接判断单词结尾是否为这些字符或组合,注意ch和sh需作为双字符处理。
      • 其他情况:直接在词尾加's'。

    代码实现

    #include <iostream>
    #include <string>
    using namespace std;
    
    struct Irregular {
        string singular;
        string plural;
    } irregular[100]; // 存储不规则单词
    
    int main() {
        int L, N;
        cin >> L >> N;
        
        // 读取不规则单词列表
        for (int i = 0; i < L; i++) {
            cin >> irregular[i].singular >> irregular[i].plural;
        }
        
        while (N--) {
            string word;
            cin >> word;
            bool found = false;
            
            // 检查是否为不规则单词
            for (int i = 0; i < L; i++) {
                if (irregular[i].singular == word) {
                    cout << irregular[i].plural << endl;
                    found = true;
                    break;
                }
            }
            
            if (!found) {
                size_t len = word.size();
                if (len == 0) { // 边界情况:空字符串(题目保证输入有效,可省略)
                    cout << endl;
                    continue;
                }
                
                // 处理以o、s、x结尾的情况
                if (word[len-1] == 'o' || word[len-1] == 's' || word[len-1] == 'x') {
                    word += "es";
                }
                // 处理以y结尾且前一个字符为辅音的情况
                else if (len >= 2 && word[len-1] == 'y') {
                    char prev = word[len-2];
                    if (prev != 'a' && prev != 'e' && prev != 'i' && prev != 'o' && prev != 'u') {
                        word[len-1] = 'i';
                        word += "es";
                    }
                }
                // 处理以ch或sh结尾的情况
                else if (len >= 2) {
                    char last_char = word[len-1];
                    char second_last = word[len-2];
                    if ((second_last == 'c' && last_char == 'h') || (second_last == 's' && last_char == 'h')) {
                        word += "es";
                    }
                }
                // 其他情况加s
                else {
                    word += "s";
                }
                
                cout << word << endl;
            }
        }
        return 0;
    }
    

    代码解释

    1. 输入处理:首先读取不规则单词的数量L和需要转换的单词数量N,然后存储不规则单词对。
    2. 不规则单词匹配:遍历结构体数组,若找到匹配的单数形式,直接输出对应的复数形式。
    3. 规则单词转换
      • o/s/x结尾:直接加"es"。
      • 辅音+y结尾:将'y'改为'i',加"es"。
      • ch/sh结尾:检查倒数第二个字符是否为'c'或's',若是则加"es"。
      • 其他情况:直接加"s"。
    4. 输出结果:根据不同规则处理后的单词输出。

    复杂度分析

    • 时间复杂度:每次查询不规则单词的时间为O(L),处理规则单词的时间为O(1)(字符串结尾判断为常数时间)。总体时间复杂度为O(L*N),适用于题目给定的数据范围(L≤20,N≤100)。
    • 空间复杂度:存储不规则单词的空间为O(L),每个单词处理的空间为O(1),总体空间复杂度为O(L)。

    该解法通过清晰的条件判断顺序和字符串操作,确保了每种规则的正确应用,能够高效处理所有输入情况。

    • 1

    信息

    ID
    2367
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者