码迷,mamicode.com
首页 > 其他好文 > 详细

解题报告 之 POJ1226 Substrings

时间:2015-06-01 22:48:24      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:poj1226 substrings   字符串   暴力   最长公共子串   

解题报告 之 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;
}




解题报告 之 POJ1226 Substrings

标签:poj1226 substrings   字符串   暴力   最长公共子串   

原文地址:http://blog.csdn.net/maxichu/article/details/46314655

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!