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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值