Substrings
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 3 Accepted Submission(s) : 2
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem 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 file 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
这个找字串的问题,题目大概意思就是找出所有字符串中共同拥有的一个字串,
该字串(正、逆字符)是任何一个母串的字串,求该子串的最长长度。
想到用STRING里的成员函数和STL的reverse反转函数,因为以前没有到过,所以翻了书
看了一下这些知识点,再写代码,本来一边AC,但是MAX初始化在外面,纠结的错了一次[转载]hdu
思路: 先找出最短的母串,即该符合要求的子串肯定在这个母串中,即在从长到短
从最短母串中取子串,在子串正反去查看是否符合要求。
说实话今天又学到了一些知识,我表示这C++的很多函数真XXX强大啊。
代码:
#include <iostream>
#include <string>
#include <algorithm> //STL reverse函数的头文件哦
using namespace std;
int main()
{
int t, n, i, j, k;
string s[102];
int sm, mlen = 200, max; //max开始就是在这里初始化的,想不通我怎么出这样的错误
cin >> t;
while(t--)
{
cin >> n;
for(i = 0; i < n; i++)
{
cin >> s[i];
if(mlen > s[i].size()) //找出最小的那个母串
{
sm = i;
mlen = s[i].size();
}
}
max = 0;
for(i = s[sm].size(); i > 0; i--) //从最小的母串开始从长到短找子串
for(j = 0; j < s[sm].size() - i + 1; j++) //长度为i的子串在母串中找
{
string s1, s2; //s1为子串正 ,s2为子串反
s1 = s[sm].substr(j, i);
s2 = s1;
reverse(s2.begin(), s2.end());
for(k = 0; k < n; k++)
if(s[k].find(s1, 0) == -1 && s[k].find(s2, 0)) //当正反子串在母串中都未发现时即跳出
break;
if(k == n && max < s1.size())
max = s1.size();
}
cout << max << endl;
}
return 0;
}