トピックます。https://www.cnblogs.com/xinz/p/7119695.html
アイデア:
遅すぎる、単に氏マッピングや検索、カット枝の最適化の下で(書かれていません)
ソース(キー部分):golangを達成
パッケージのメイン インポート( "コンテナ/リスト" "FMT" "最長ワードチェーン/ SRC /ファイル" "最長ワードチェーン/ SRC / PLIST" ) ドゥ(のL * list.List)FUNC { HC、EC:= GetWordHeaderAndEnd(L) グラフ:= MakeGraph(HC、EC、l.Len()) = list.New():ちゃんず iについて:= 0; iがlenの<(グラフ)。I ++ { chanList:= list.New() chanList.PushBack(plist.GetListValue(L、I)) visitedArr:=([] BOOL、l.Len())する visitedArr [i]が真= jについて:= 0; J <LEN(グラフ)。J ++ { グラフなら[I] [J] == 1 && iが= J && visitedArr [J] =真{! visitedArr [j]が真= } kについて:= 0; K < のみ(グラフ)。{++ chanList.InsertBefore(plist.GetListValue(L、j)を、 } もしグラフ[K] [I] == 1 && I!= K && visitedArr [k]が!= trueの場合は{ visitedArr [k]は= TRUE chanList.InsertAfter(plist.GetListValue(L、K)、chanList.Front() ) } } もしchanList.Front()!=ゼロ{ chans.PushBack(chanList) } } PrintMax(L、ちゃんず) PRINTALL(L、ちゃんず) } MakeGraph FUNC(headerChars []バイト、endChars []バイト、レンスのINT) [] [] INT { グラフ:=([] [] INT、レンス)を作る iについて:= 0; 私はレンスを<; 私は{++ グラフは、[I] =([] INT、レンス)する jについて:= 0; J <レンス。J ++ { グラフ[I] [J] = 0 } } iについて:= 0; 私は、LEN(headerCharsを)<; I ++ { jに対して:= 0; J <LEN(endChars)。J ++ { もしheaderChars [I] == endChars [J] && I!= J { グラフ[I] [J] = 1 } } } 戻りグラフ } GetWordHeaderAndEnd(のL * list.List)FUNC([]バイト、[]バイト){ headerArr:=作る([]バイト、l.Len()) endArr:=作る([]バイト、l.Len()) I:= 0 アイテムの:= l.Front()。!アイテム= nilを; アイテム= item.Next(){ S:= item.Value(列) headerArr [I] =のS [0] endArr [I] = sの[LEN(S)-1] I ++ } headerArr、endArrを返す } FUNC PRINTALL (L * list.List、ちゃんず* list.List){ fmt.Print( "\ N \ n印刷全て:の\ n") I:= 0 CHAN1用:= chans.Front()。!= nilをCHAN1。CHAN1 = chan1.Next(){ fmt.Printf( "%D"、I) 。項目の:= chan1.Value(* list.List).Front(); !アイテム= nilを; アイテム= item.Next(){ fmt.Printf( "%sの"、item.Value) } fmt.Println() iは++ } } PrintMax(1- * list.List、ちゃんず* list.List){FUNC レンス:0 = VaRのmaxChan * list.List CHAN1用:= chans.Front(); != nilをCHAN1。CHAN1 = chan1.Next(){ CURR:= chan1.Value(* list.List) レンス<curr.Len(){もし レンス= curr.Len() maxChan = CURR } } file.WriteFileAndCreate( "答え"、 maxChan) fmt.Print( "\ nは\ n印刷最大:\ nを") アイテムの:= maxChan.Front()。!アイテム= nilを; アイテム= item.Next(){ fmt.Printf( "%sの"、アイテム。 }
完全なソースコード:https://github.com/liujh2010/LearnGolong/tree/master/longest-word-chain