PAT - A1077 Kuchiguse (20分) https://pintia.cn/problem-sets/994805342720868352/problems/994805390896644096
大致思路:
从后往前逐个字符比较各字符串,出现字符不同时停止,记录相同部分的边界位置。处理完全部字符串后,根据边界位置情况判断输出。
注意点:
- 输入带空格字符串,gets 函数存在安全隐患,PAT已禁止使用,对于C语言(非C++)可用 fgets 或 特殊格式控制的 scanf (以下代码使用此种方式)或逐字符读入等;
- 注意 已确定的后缀部分字符串的长度 和 新输入的字符串的长度 不等(前者长后者短 或 前者短后者长)时 对边界的不同的处理;
通过代码(C/C++):
#include<stdio.h>
#include<string.h>
int main(){
int N;
char words1[257], words2[257];
scanf("%d", &N);
getchar(); // 吸收换行符'\n'
scanf("%[^\n]", words1); //将遇到换行'\n'字符前的任意字符串读入
getchar(); // 吸收换行符'\n'
int left_suffix=0, right_suffix=strlen(words1);//后缀字符串的左、右边界('\0')在第一个字符串中的位置
for(int i=1;i<N;i++){
scanf("%[^\n]", words2);
getchar();
if(left_suffix==right_suffix) continue; // 后缀长度已减为0,即确定后缀不存在,无需后续处理,但仍应完成全部输入
int left=0, right=strlen(words2); //本轮处理的字符串左右边界位置
int len_suffix=right_suffix-left_suffix, len=right-left; // 后缀和本轮输入字符串的长度
if(len < len_suffix) // 本轮输入字符串比后缀短,直接缩短后缀(更新左边界)
left_suffix = right_suffix-len;
if(len > len_suffix) // 本轮输入字符串比后缀长,更新其后续判断处理的左边界
left = right-len_suffix;
for(int j=1;j<=right-left;j++){
if(words2[right-j]!=words1[right_suffix-j]){ // 出现不同字符时更新后缀左边界,并可提前结束本轮处理
left_suffix=right_suffix-j+1;
break;
}
}
}
if(left_suffix==right_suffix){
printf("nai");
}else{
for(int i=left_suffix;i<right_suffix;i++) putchar(words1[i]);
}
return 0;
}