最长子串

题目:
有一些由英文组成的大小写敏感的字符串,找到一个最长的子串,使得对于已经给出的字符串中任意一个串y,x或者是y的子串,或者x中的字符串反序之后得到的新串是y的子串。

输入:
第一行表示测试的组数t
第二行表示字符串的个数n
接下来n行表示字符串

样例:

2
3
ABCD
BCDFF
BRCD
2
rose
orchid

输出

2
2

代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string>

int main() {
	char str[100][101], minStr[101], subStr[101], revSubStr[101];
	unsigned int i, j, t, m, n, substrlen, found, minlen;
	scanf("%d", &t);//测试数据组数
	while (t--) {
		scanf("%d", &n);
		minlen = 101;
		for (i = 0; i < n; i++) {//读入所有数据串
			scanf("%s", str[i]);
			if (strlen(str[i]) < minlen) {//查找最短的字符串
				minlen = strlen(str[i]);
				m = i;
			}
		}
		strcpy(minStr, str[m]);//查找到最短的串
		substrlen = minlen;
		while (substrlen > 0) {//取子串长度
			for (i = 0; i <= minlen - substrlen; i++) {
				strncpy(subStr, minStr + i, substrlen);//取正向子串
				subStr[substrlen] = '\0';
				strncpy(revSubStr, minStr + i, substrlen);//取逆向子串
				revSubStr[substrlen]='\0';
				_strrev(revSubStr);
				found = 1;
				for (j = 0; j < n; j++) {//在所有子串中查找是否包含正或者逆向子串
					if (strstr(str[j], subStr) == NULL && strstr(str[j], revSubStr) == NULL) {
						found = 0;
						break;
					}//在str[j]中不存在子串
				}
				if (found)
					break;//找到子串,结束
			}
			if (found)
				break;//找到子串,结束
			substrlen--;//没找到子串子串长度减1,再试
		}
		printf("%d\n", substrlen);//输出找到子串长度
	}
	getchar();//测试加上,否则可以删除
	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值