[PAT-A 1077]Kuchiguse

在这里插入图片描述
在这里插入图片描述
题目大意:
给定N个字符串,求它们的公共后缀.如果不存在公共后缀,则输出"nai" 。

思路:
1.将所有输入的字符串逆置,并同时统计每个字符串的长度,保存所有字符串的最小长度。(防止遍历的时候越界)
2.对从第1个到第n个字符串的每一个字符都与第0个字符串的相同位置的字符比较,相同则为公共后缀的部分,
,同时设置变量ans保存公共字串的长度。一旦出现不同,立即退出循环。
3.判断ans是否大于0,如果不是,倒序第0个字符串的前ans个字符,如果不是,则证明没有公共后缀,输出"nai"。

注意:
1.scanf输入的时候遇到空格会结束,本题要求空格也算字符,需要手动令scanf的结束符为\n。
2.每输入一次,都需要getchar(),在输出的循环中,getchar要在scnaf的后面,否则最后一个case通不过。

AC代码:

#include<cstdio>
#include<cstring>
using namespace std;
int n, minLen = 256, ans = 0;//ans保存公共子串的长度
char s[110][256];
int main() {
	(void)scanf("%d", &n);
	getchar();
	for (int i = 0; i < n; i++) {
		(void)scanf("%[^\n]", s[i]);
		getchar();
		int len = strlen(s[i]);
		if (len < minLen) minLen = len;//记录最小的串的长度,防止越界
		for (int j = 0; j < len / 2; j++) {
			char temp = s[i][j];
			s[i][j] = s[i][len - j - 1];
			s[i][len - j - 1] = temp;
		}
	}
	for (int i = 0; i < minLen; i++) {
		char c = s[0][i];
		bool same = true;
		for (int j = 1; j < n; j++) {
			if (c != s[j][i]) {
				same = false;
				break;
			}
		}
		if (same == true) ans++;//如果所有字符串的第i位相等,则计数器ans++。
		else break;
	}
	if (ans != 0) {
		for (int i = ans - 1; i >= 0; i--) {
			printf("%c", s[0][i]);
		}
	}
	else printf("nai");
	return 0;
}
发布了101 篇原创文章 · 获赞 1 · 访问量 2989

猜你喜欢

转载自blog.csdn.net/weixin_44699689/article/details/104151959