// 子串.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
要求:一组字符串,找到最长的字符串,要么是其子串、要么是其反序之后是所有字符串的子串
//解决:1:找到最短的字符串,然后从各字符串从长到短进行判断
//2:熟练掌握strlen/strncpy(复制n个字符串的子串)/strcpy(复制字符串)/strstr(在字符串中寻找字符子串)/strrev(对字符串进行反序)
http://bailian.openjudge.cn/practice/2744/
#include<stdio.h>
#include<string.h>
char str[101][101];
int t,n;
//oj上G++不支持strrev,所以要自己写一个strrev;
void strrev1(char *s) {
int len, i, j;
len = strlen(s);
char revs[101];
for (i = 0, j = len - 1; j >= 0; i++, j--) {
revs[i] = s[j];
}
strcpy(s, revs);
};
int find(char * source)
{
int sub = strlen(source);int sourcelen=strlen(source);
char substr[101], subrev[101];bool flag;
while (sub>0)
{
for (int i = 0; i <= sourcelen - sub; i++)
{
strncpy(substr, source + i, sub);
strncpy(subrev, source + i, sub);
strrev1(subrev);
substr[sub] = subrev[sub] = '\0';
flag = true;
for (int j = 0; j < n; j++)
{
if (strstr(str[j], substr) == NULL && strstr(str[j], subrev) == NULL)
{
flag = false;
break;
}
}
if (flag)return sub;
}
sub--;
}
return 0;//0别忘了
}
int main()
{
int minstr; char mins[101];//minstr
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
minstr = 101;
for (int i = 0; i < n; i++)
{
scanf("%s", str[i]);
/*int len = strlen(str[i]);*/
if (strlen(str[i]) < minstr)
{
minstr = strlen(str[i]);
strcpy(mins, str[i]);
}
}
int m = find(mins);
printf("%d\n", m);
}
return 0;
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
// 入门使用技巧:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
poj:子串题解
最新推荐文章于 2022-07-21 20:47:48 发布