这道题是华为oj上的,非常low,题目中有些隐含条件未有描述清楚,比如输入都是4个字符的字符串,只有3个字符重合时才能相连接。
如下代码中被注释掉的部分是为了迎合oj评价系统而改动,非我本意。
代码使用DFS解决,使用floyd求解最长路径是不行的,原理上不能讲通。
| 描述 |
给定n个字串,其中一个字串的后m个字符,是下一个字串的开始。 找出所有字串中的能连接起来的最长路径。 |
|---|---|
| 知识点 | 查找,排序 |
| 运行时间限制 | 10M |
| 内存限制 | 128 |
| 输入 | |
| 输出 | |
| 样例输入 | ABCC ABCD BCCE BCDE CCEF BCCE CCEG CEGF |
| 样例输出 | ABCCEGF |
#include<iostream>
#include<string>
#include<vector>
#define INF 100000000
using namespace std;
int getlength(string a, string b)
{
int numa = a.length();
int numb = b.length();
int nummin = numa > numb ? numb : numa;
int i;
// for(i=nummin; i>0; i--)
// {
i = 3;
bool flag = true;
for(int j=0; j<i; j++)
{
if( a[numa-i+j] != b[j] )
flag = false;
}
//if(flag) break;
//}
if(flag==false)
return 0;
else
return 1;
//return numb-i;
}
//sovle
void dfs(int start, int num, int &now, int &max, vector<int> &path, vector<int> &maxpath, int **graph, int *flag)
{
bool hasone = false;
for(int i=0; i<num; i++)
{
if(graph[start][i] > 0 && flag[i] == 1)
{
hasone = true;
flag[i] = 0;
now += graph[start][i];
path.push_back(i);
dfs(i,num, now, max, path, maxpath, graph, flag);
flag[i] = 1;
now -= graph[start][i];
path.pop_back();
}
}
if(hasone==false)
{
if(now > max)
{
max = now;
maxpath.clear();
for(unsigned int i=0; i<path.size(); i++)
{
maxpath.push_back(path[i]);
}
}
}
}
void printit(vector<int> &path, vector<string> &vstr, int **graph)
{
int i = 0;
for(unsigned int j=0; j<path.size(); i=path[j], j++)
{
//cout<<path[j]<<','<<graph[i][path[j]]<<endl;
int leng = vstr[path[j]-1].length();
for(int k=leng-graph[i][path[j]]; k<leng; k++)
{
cout<<vstr[path[j]-1][k];
}
}
}
int main()
{
vector<string> vstr;
string tmp;
while(cin>>tmp)
{
vstr.push_back(tmp);
}
int **graph;
int num = vstr.size()+1;
graph = new int* [num];
for(int i=0; i<num; i++)
{
graph[i] = new int [num];
}
//init graph
for(int i=1; i<num; i++)
{
graph[0][i] = vstr[i-1].length();
}
for(int i=0; i<num; i++)
{
graph[i][0] = 0;
}
for(int i=1; i<num; i++)
{
for(int j=1; j<num; j++)
{
graph[i][j] = getlength(vstr[i-1], vstr[j-1]);
if(i==j)
{
graph[i][j] = 0;
}
}
}
//show
/*
for(int i=0; i<num; i++)
{
for(int j=0; j<num; j++)
{
cout<<graph[i][j]<<' ';
}
cout<<endl;
}
*/
// init flag
int *flag;
flag = new int [num];
for(int i=0; i<num; i++)
{
flag[i] = 1;
}
int now = 0;
int max = 0;
vector<int> path;
vector<int> maxpath;
//dfs
dfs(0, num, now ,max, path, maxpath, graph, flag);
//output
//cout<<max<<endl;
printit(maxpath, vstr, graph);
//free space
delete [] flag;
for(int i=0; i<num; i++)
{
delete [] graph[i];
}
delete [] graph;
return 0;
}