// https :// blog . use journal . com / top - 5 0 - dynamic - programming - practice - problems - 4 2 0 8 fed 7 1 aa 3 Ċ // https :// www . tech ie de light . com / longest - common - substring - problem / Ċ // https :// en . wikipedia . org / wiki / Lon gest _ common _ substring _ problem Ċ Ċ @ file : Suppress (" Package Directory Mismatch ", Ġ" FunctionName ", Ġ" PackageName ") Ċ Ċ package ĠL on gest _ Common _ Sub String Ċ Ċ import Ġutils . Array 2 D Ċ Ċ fun Ġmain () Ġ{ Ċ ĉ println (" Lon gest ĠCommon ĠSub String Ġvia ĠDP :\ n lookup Ġholds Ġanswer ") Ċ ĉ while Ġ( true ) Ġ{ Ċĉ ĉ val ĠX Ġ= Ġread Line () !! Ġ// ĠAB CB D AB Ċĉ ĉ val ĠY Ġ= Ġread Line () !! Ġ// ĠB DC AB A Ċĉ ĉ val Ġres Ġ= ĠLC Sub Str _ DP ( X , ĠY ) Ċĉ ĉ println ( res ) Ċ ĉ } Ċ } Ċ Ċ fun ĠLC Sub Str _ DP ( X : ĠString , ĠY : ĠString ): ĠString Ġ{ Ċ ĉ val Ġlookup Ġ= ĠArray 2 D ( rows Ġ= ĠX . length Ġ+ Ġ 1 , Ġcols Ġ= ĠY . length Ġ+ Ġ 1 ) Ġ{ Ġ_, Ġ_ Ġ-> Ġ"" Ġ} Ċ ĉ var Ġmax Ġ= Ġ"" ĊĊ ĉ ( 1 .. X . length ). forEach Ġ{ Ġi Ġ-> Ċĉ ĉ val Ġx Ġ= ĠX [ i Ġ- Ġ 1 ] Ċĉ ĉ ( 1 .. Y . length ). forEach Ġ{ Ġj Ġ-> Ċĉĉ ĉ val Ġy Ġ= ĠY [ j Ġ- Ġ 1 ] Ċĉĉ ĉ if Ġ( x Ġ== Ġy ) Ġ{ Ċĉĉĉ ĉ lookup [ i ][ j ] Ġ= Ġlookup [ i Ġ- Ġ 1 ][ j Ġ- Ġ 1 ] Ġ+ Ġx Ċĉĉĉ ĉ if Ġ( max . length Ġ< Ġlookup [ i ][ j ]. length ) Ċĉĉĉĉ ĉ max Ġ= Ġlookup [ i ][ j ] Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } Ċ ĉ return Ġmax Ċ } Ċ