[アルゴリズム]最長のワードチェーン

トピックます。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

おすすめ

転載: www.cnblogs.com/liujh2010/p/longest-word-chain.html