思路:
1.找出n个字符串中最短的字符串Str[N]
2.从长到短找Str[N]的子子串 subStr[N],以及subStr[N]的反转字符串strrev(subStr[N]);(从长到短是做剪枝处理)
3.用strstr()函数遍历所有的字符串,看是否含有此子子串subStr[N]或strrev(subStr[N]);只要有一个字符串不包含subStr[N]或strrev(subStr[N])就放弃这个子串,尝试下一个;
4.找到第一个满足要求的就输出strlen(subStr[N])或者strlen(strrev(subStr[N])); 这里可以用string.h头问件中的一个函数strncpy(str1, str2, n);功能:将字符串2中的最多n个字符复制到字符数组1中;
这里可以直接返回n;
#include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> #include<ctype.h> #include<queue> #include<stack> #include<math.h> #include<vector> #include<stdlib.h> using namespace std; #define INF 0x3f3f3f3f #define N 110 struct MAZE { char str[N]; int len; } maze[N]; bool cmp(MAZE x, MAZE y) { return x.len<y.len; } int solve(int n); int Find(char str[], int n); int main() { int t, n; scanf("%d", &t); while(t--) { memset(maze, 0, sizeof(maze)); scanf("%d", &n); for(int i=0; i<n; i++) { scanf("%s", maze[i].str); maze[i].len=strlen(maze[i].str); } sort(maze, maze+n,cmp); int ans=solve(n); printf("%d\n", ans); } return 0; } int solve(int n) { char Str[N]; for(int i=maze[0].len; i>0; i--) { strcpy(Str, maze[0].str); strcat(Str, maze[0].str); for(int j=0; j<maze[0].len; j++) { char subStr[N]; memset(subStr, 0, sizeof(subStr));//必须初始化 strncpy(subStr, Str+j, i); if(Find(subStr, n)) return i; if(Find(strrev(subStr), n)) return i; } } return 0; } int Find(char s[], int n) { for(int i=1; i<n; i++) { if(!(strstr(maze[i].str, s))) return 0; } return 1; }
时间: 2024-11-02 17:17:38