37.最長字串連結
阿新 • • 發佈:2019-01-08
有n個長為m+1的字串,如果某個字串的最後m個字元與某個字串的前m個字元匹配,
則兩個字串可以聯接,問這n個字串最多可以連成一個多長的字串,如果出現迴圈,則返回錯誤。
思路 :分析一下,將各個字串作為一個節點,首尾連結就好比是一條邊,將兩個節點連線起來,於是問題就變
成一個有關圖的路徑長度的問題。連結所得的字串最長長度即為從圖的某個節點出發所能得到的最長路
徑問題,與最短路徑類似,可以應用弗洛伊德演算法求解。對於迴圈,即可認為各個節點通過其他節點又回
到自己,反應在路徑長度上,就表示某個節點到自己節點的路徑大於零(注:初始化個節點到自己的長度為零)。
#include<iostream> #include<string> using namespace std; #define length 14 bool Isconnect(string str1,string str2) { if(str1.size()!=str2.size()) return false; int m=str1.size(); for(int i=0;i<m-1;i++) { if(str1[i+1]!=str2[i]) return false; } return true; } void Maxstring(string str[]) { int G[length][length]={0}; for(int i=0;i<length;i++) for(int j=0;j<length;j++) if(Isconnect(str[i],str[j])) G[i][j]=1; for(int i=0;i<length;i++) for(int j=0;j<length;j++) for(int k=0;k<length;k++) { if(G[i][k]!=0&&G[k][j]!=0) { int dis=G[i][k]+G[k][j]; if(dis>G[i][j]) G[i][j]=dis; } } for(int i=0;i<length;i++) if(G[i][i]>1) { cout<<"circle is deteted"<<endl; return; } int max=0; for(int i=0;i<length;i++) for(int j=0;j<length;j++) { if(G[i][j]>max) max=G[i][j]; } cout<<"Max length is "<<max+str[0].size()<<endl; } int main() { string str[length]={ "abcd", "bcde", "cdea", "deab", "eaba", "abab", "deac", "cdei", "bcdf", "cdfi", "dfic", "cdfk", "bcdg", "babc"}; Maxstring(str); }
如果在text字串陣列中再加一個"babc",就將形成環路,導致一些節點自身的路徑非零,環路檢測會報告出錯。