首先了解两个 cstring 的库函数:strncpy、strstr。
找到所有字符串中最短的一个,从长到短依次判断其子串(正序或逆序)是否为其他字符串的子串,找到则返回子串长度,否则返回 0。
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 105;
int n;
char str[MAXN][MAXN]; //输入字符串
//查找最长公共子串的长度
int subString(int minLen, int index)
{
char temp[MAXN]; //临时串
char pos[MAXN], rev[MAXN]; //正序子串,逆序子串
bool flag; //子串是否存在
strcpy(temp, str[index]);
int len = minLen; //最长公共子串的长度
while (len > 0)
{
flag = 0;
for (int i = 0; i <= minLen - len; i++)
{
flag = 1;
strncpy(pos, temp + i, len); //从temp[i]开始,取len个字符,复制到pos中
for (int j = 0; j < len; j++) //将pos逆序复制到rev中
rev[j] = pos[len - j - 1];
pos[len] = rev[len] = '\0'; //字符数组,末尾加上'\0'
for (int j = 0; j < n; j++) //依次判断字符串中是否有正序或逆序的子串
{
if (strstr(str[j], pos) == NULL && strstr(str[j], rev) == NULL)
{
flag = 0;
break;
}
}
if (flag)
break;
}
if (flag)
break;
--len;
}
return len;
}
int main()
{
int t;
cin >> t;
while (t--)
{
cin >> n;
int minLen = MAXN; //最短字符串的长度
int index; //最短字符串的位置
for (int i = 0; i < n; i++) //查找最短字符串
{
cin >> str[i];
if (strlen(str[i]) < minLen)
{
minLen = strlen(str[i]);
index = i;
}
}
cout << subString(minLen, index) << endl;
}
return 0;
}
继续加油。