A1077.Kuchiguse

题意:

找出n个字符串的最长公共后缀

思路分析

在输入字符串的过程中,求得前一个字符串的长度len1,求得当前字符串的长度len2,而后分别从两个字符串的末尾向前枚举比较,并且记录后缀的长度,就这样两两比较,直到输入完毕。这样最终就获得了最长公共后缀长度index。
 获得了最长公共后缀长度index后,设最后一个字符串的长度为len,则从len-index处开始向后枚举所有的字符即可。

注意点

  • 因为每个字符串可能存在空格,所有不能简单实用scanf("%s")去输入,而是使用fgets(buf,maxn,stdin)输入完整的一行
  • 注意一旦两两比较的字符串的最大公共后缀长度index=0,则设置标记flag为false,这样最后输出时直接输出nai即可。

该程序的时间复杂度为O(n*len),len最大可以取到256

参考代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <stdio.h>
using namespace std;
const int maxn = 110;
char buf[maxn][260];

int main(void){
	int n;cin>>n;
	bool flag = true;			//默认存在相同后缀 
	int index;
	getchar();		//消除回车的影响 
	for(int i = 0;i < n;i++) {
		index = 0;
		fgets(buf[i],260,stdin);
		if(i > 0) {
			int len1 = strlen(buf[i-1]) - 1;
			int len2 = strlen(buf[i]) - 1;
			for(int x = len1-1,y = len2 - 1;x >= 0 && y >= 0;x--,y--) {
				if(buf[i-1][x] == buf[i][y]) 
					index++;
				else break;
			}
			if(index == 0) {
				flag = false;
			}
		}
	}
	
	if(flag == false) printf("nai");
	else {
		int len = strlen(buf[n-1]) - 1;
		for(int i = len - index;i < len;i++) {
			printf("%c",buf[n-1][i]);
		}
	}
	return 0;
}
posted @ 2019-01-28 17:05  Western_Trail  阅读(184)  评论(0)    收藏  举报