解题报告 之 POJ1226 Substrings
Description
You are given a number of case-sensitive strings of alphabetic characters, find the largest string X, such that either X, or its inverse can be found as a substring of any of the given strings.
Input
The first line of the input contains a single integer t (1 <= t <= 10), the number of test cases, followed by the input data for each test case. The first line of each test case contains a single integer n (1 <= n <= 100), the number of given strings, followed by n lines, each representing one string of minimum length 1 and maximum length 100. There is no extra white space before and after a string.
Output
There should be one line per test case containing the length of the largest string found.
Sample Input
2 3 ABCD BCDFF BRCD 2 rose orchid
Sample Output
2 2
题目大意:给你一堆字符串,大小写敏感,求他们的最大公共子串(或反转子串),即在每个字符串中,这个子串正序或者逆序出现均可。输出最长公共子串(反转子串)长度。比如样例1的结果就是CD(DC)=2。
分析:这道题是很简单的,暴力解决,不涉及字符串高端算法。具体做法先到最短字符串,公共子串必然出自它的某个子串。然后遍历最短字符串的所有子串,去逐一验证即可,因为n才100。个人感觉用string比char*方便,大家看自己的习惯。string::npos表示find没找到该子串。关于rbegin和rend和string(...)的用法自行百度C++ string。
上代码:
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
const int INF = 0x3f3f3f3f;
string str[110];
int main()
{
int kase,n;
int minl=INF;
int minpos;
cin >> kase;
while(kase--)
{
minl = INF;
cin >> n;
for(int i = 0; i < n; i++)
{
cin >> str[i];
if(str[i].length() < minl)
{
minl = str[i].length();
minpos = i;
}
}
string key = str[minpos];
string tem, rev;
for(int i = minl; i >= 1; i--) //取字符串长度
{
for(int j = 0; j + i -1 < minl; j++)
{
tem = string( key.begin() + j, key.begin() + j + i );
rev = string( tem.rbegin(), tem.rend() );
bool flag = true;
for(int k = 0; k < n; k++)
{
if(str[k].find( tem ) == string::npos && str[k].find( rev ) == string::npos)
{
flag = false;
break;
}
}
if(flag)
{
printf( "%d\n", i );
goto here;
}
}
}
printf( "0\n" );
here:;
}
return 0;
}