Substrings
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4177 Accepted Submission(s): 1871
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
23ABCDBCDFFBRCD2roseorchid
Sample Output
22
题目简意:寻找给定若干字符串中的最长公共子序列 其中该序列可正序可反序
// HDOJ_1238.cpp : Substrings
//求子串:s.substr(position,len);
//查找字串:s.find(s1);如果没找到,则返回-1,可用s.find(s1)!=-1来判断是否找到子串
//求字符串长度:s.length()
//翻转字符串:reverse(s.begin(),s.end())会把s自己本身翻转过来
#include "StdAfx.h"
#include <fstream>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
//reverse函数在algorithm中 不过VS有了"StdAfx.h"就不需要它了
//sort也在algorithm中 但只有"StdAfx.h"又不行 奇怪
using namespace std;
int main()
{
ifstream cin("1238_input.txt"); //调试用
int t, n, i, j, k; //t=test cases
cin >> t;
while ( t-- ){
cin >> n;
string *a = new string[n];
string *b = new string[n];
int minLength = 150;
int minIndex;
for( i=0; i<n; i++ ){
cin >> a[i];
b[i] = a[i];
reverse(b[i].begin(),b[i].end()); //reverse为void类型
if( minLength > a[i].length() ){
minLength = a[i].length();
minIndex = i;
}
}
//cout << minLength << endl;
string subString;
bool fail;
int maxLength=0;
for( i=0; i<minLength; i++ )
for( j=1; j<=minLength-i; j++ ){
fail = 0;
subString = a[minIndex].substr(i,j);
//cout << subString << endl;
for( k=0; k<n; k++ ){
if(a[k].find(subString)!=-1 && k==n-1 ){
maxLength = max(maxLength, j);
//cout << maxLength << endl;
}
if(a[k].find(subString)==-1){ //返回-1表未找到
if(b[k].find(subString)==-1 ){
fail = 1;
break; //从k循环跳出
}
else if( k==n-1 )
maxLength = max(maxLength, j);
}
}
if( fail == 1 )
break;
}
delete []a;
delete []b;
cout << maxLength << endl;
}//while
return 0;
}