HDOJ 1238:Substrings 寻找最长子序列 解题报告

来源:互联网 发布:dll不兼容windows 编辑:程序博客网 时间:2024/06/08 15:19

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
2
3
ABCD
BCDFF
BRCD
2
rose
orchid
 

Sample Output
2
2
 


题目简意:寻找给定若干字符串中的最长公共子序列 其中该序列可正序可反序

// 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 casescin >> 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;}


原创粉丝点击