字串的连接最长路径查找

这道题是华为oj上的,非常low,题目中有些隐含条件未有描述清楚,比如输入都是4个字符的字符串,只有3个字符重合时才能相连接。

如下代码中被注释掉的部分是为了迎合oj评价系统而改动,非我本意。

代码使用DFS解决,使用floyd求解最长路径是不行的,原理上不能讲通。

描述

给定n个字串,其中一个字串的后m个字符,是下一个字串的开始。

找出所有字串中的能连接起来的最长路径。

知识点 查找,排序
运行时间限制 10M
内存限制 128
输入

 

输出

 

样例输入 ABCC ABCD BCCE BCDE CCEF BCCE CCEG CEGF
样例输出 ABCCEGF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#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;
}

  

posted @   Hardsoftware  阅读(713)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示