我的PAT-ADVANCED代码仓:https://github.com/617076674/PAT-ADVANCED
原题链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805390896644096
题目描述:
题目翻译:
1077 口头禅
日语因其句子结尾部分而臭名昭着。这种结尾部分的个人偏好可以被视为说话者个性的反映。这种偏好被称为“Kuchiguse”,在动漫和漫画中经常被夸大。例如,人为地在句子结束部分加上“nyan~”经常被用作具有猫般个性的角色的刻板印象:
Itai nyan~(好痛,nyan~)
Ninjin wa iyada nyan~(我讨厌胡萝卜,nyan~)
现在给出同一个角色说的几句话,你能找到她的Kuchiguse吗?
输入格式:
每个输入文件包含一个测试用例。对于每个测试用例,第一行是整数N(2 <= N <= 100)。接下来N行,每行是包含0~256(含)个字符的字符串,每个字符串代表一个人的一句话。每行区分大小写。
输出格式:
对于每个测试用例,在一行中打印字符串的“kuchiguse”,即所有N行的最长公共后缀。如果没有这样的后缀,打印nai。
输入样例1:
3
Itai nyan~
Ninjin wa iyadanyan~
uhhh nyan~
输出样例1:
nyan~
输入样例2:
3
Itai!
Ninjinnwaiyada T_T
T_T
输出样例2:
nai
知识点:字符串
思路:对每个字符串翻转后求其最长公共后缀
PAT不支持使用cstring头文件中的strrev函数,因此需要我们自己写一个翻转字符串的函数。
时间复杂度和空间复杂度均是O(N)。
C++代码:
#include<iostream>
#include<cstring>
void reverse(char* str, int N);
int main() {
int N;
scanf("%d", &N);
getchar();
char input[N][257];
for(int i = 0; i < N; i++) {
scanf("%[^\n]", input[i]);
reverse(input[i], strlen(input[i]));
getchar();
}
char result[257];
int index = 0;
while(true) {
bool flag = true;
for(int i = 0; i < N - 1; i++) {
if(index >= strlen(input[i]) || index >= strlen(input[i + 1]) || input[i][index] != input[i + 1][index]) {
flag = false;
}
}
if(!flag){
break;
}
result[index] = input[0][index];
index++;
}
result[index] = '\0';
reverse(result, strlen(result));
if(strlen(result) == 0){
printf("nai\n");
}else{
printf("%s\n", result);
}
return 0;
}
void reverse(char* str, int N){
for(int i = 0; i < N / 2; i++){
char temp = *(str + i);
*(str + i) = *(str + N - i - 1);
*(str + N - i - 1) = temp;
}
}
C++解题报告: