字串的连接最长路径查找
这道题是华为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; } |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步