1 条题解
-
0
题解:复数形式转换
题目分析
本题要求根据给定规则将单词转换为复数形式。规则分为四类:不规则单词直接替换、辅音+y结尾的单词转换、特定后缀(o/s/ch/sh/x)加es、其他情况加s。需要依次判断每个单词符合的规则,进行相应转换。
解题思路
- 不规则单词处理:使用结构体数组存储不规则单词及其复数形式,通过遍历数组匹配单词,直接返回对应的复数形式。
- 规则单词处理:
- 判断后缀长度:对于需要检查双字符后缀(如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; }
代码解释
- 输入处理:首先读取不规则单词的数量L和需要转换的单词数量N,然后存储不规则单词对。
- 不规则单词匹配:遍历结构体数组,若找到匹配的单数形式,直接输出对应的复数形式。
- 规则单词转换:
- o/s/x结尾:直接加"es"。
- 辅音+y结尾:将'y'改为'i',加"es"。
- ch/sh结尾:检查倒数第二个字符是否为'c'或's',若是则加"es"。
- 其他情况:直接加"s"。
- 输出结果:根据不同规则处理后的单词输出。
复杂度分析
- 时间复杂度:每次查询不规则单词的时间为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
- 上传者