▁need le . length ; ▁i ▁> ▁ 0 ; ▁-- i ) ▁{ ▁▁▁▁▁▁▁▁▁▁▁▁ ▁if ▁( is Prefix ( need le , ▁i )) ▁{ ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ ▁last Prefix Position ▁= ▁i ; ▁▁▁▁▁▁▁▁▁▁▁▁ ▁} ▁▁▁▁▁▁▁▁▁▁▁▁ ▁table [ need le . length ▁- ▁i ] ▁= ▁last Prefix Position ▁- ▁i ▁+ ▁need le . length ; ▁▁▁▁▁▁▁▁ ▁} ▁▁▁▁▁▁▁▁ ▁for ▁( int ▁i ▁= ▁ 0 ; ▁i ▁< ▁need le . length ▁- ▁ 1 ; ▁++ i ) ▁{ ▁▁▁▁▁▁▁▁▁▁▁▁ ▁int ▁sl en ▁= ▁suffix Length ( need le , ▁i ); ▁▁▁▁▁▁▁▁▁▁▁▁ ▁table [ s len ] ▁= ▁need le . length ▁- ▁ 1 ▁- ▁i ▁+ ▁sl en ; ▁▁▁▁▁▁▁▁ ▁} ▁▁▁▁▁▁▁▁ ▁return ▁table ; ▁▁▁▁ ▁} ▁▁▁▁▁ ▁/** ▁▁▁▁▁ ▁* ▁Is ▁need le [ p : end ] ▁a ▁prefix ▁of ▁need le ? ▁▁▁▁▁ ▁*/ ▁▁▁▁ ▁private ▁static ▁boolean ▁is Prefix ( char [] ▁need le , ▁int ▁p ) ▁{ ▁▁▁▁▁▁▁▁ ▁for ▁( int ▁i ▁= ▁p , ▁j ▁= ▁ 0 ; ▁i ▁< ▁need le . length ; ▁++ i , ▁++ j ) ▁{ ▁▁▁▁▁▁▁▁▁▁▁▁ ▁if ▁( need le [ i ] ▁!= ▁need le [ j ]) ▁{ ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ ▁return ▁false ; ▁▁▁▁▁▁▁▁▁▁▁▁ ▁} ▁▁▁▁▁▁▁▁ ▁} ▁▁▁▁▁▁▁▁ ▁return ▁true ; ▁▁▁▁ ▁} ▁▁▁▁▁ ▁/** ▁▁▁▁▁ ▁* ▁Returns ▁the ▁maximum ▁length ▁of ▁the ▁substring ▁ends ▁at ▁p ▁and ▁is ▁a ▁suffix . ▁▁▁▁▁ ▁* ▁( good ▁suffix ▁rule ) ▁▁▁▁▁ ▁*/ ▁▁▁▁ ▁private ▁static ▁int ▁suffix Length ( char [] ▁need