▁/** ▁▁▁▁▁ ▁* ▁Returns ▁the ▁index ▁within ▁this ▁string ▁of ▁the ▁first ▁occurrence ▁of ▁the ▁▁▁▁▁ ▁* ▁specified ▁substring . ▁If ▁it ▁is ▁not ▁a ▁substring , ▁return ▁- 1 . ▁▁▁▁▁ ▁* ▁▁▁▁▁ ▁* ▁There ▁is ▁no ▁Gal il ▁because ▁it ▁only ▁generates ▁one ▁match . ▁▁▁▁▁ ▁* ▁▁▁▁▁ ▁* ▁@ param ▁hay stack ▁The ▁string ▁to ▁be ▁sc anned ▁▁▁▁▁ ▁* ▁@ param ▁need le ▁The ▁target ▁string ▁to ▁search ▁▁▁▁▁ ▁* ▁@ return ▁The ▁start ▁index ▁of ▁the ▁substring ▁▁▁▁▁ ▁*/ ▁▁▁▁ ▁public ▁static ▁int ▁index Of ( char [] ▁hay stack , ▁char [] ▁need le ) ▁{ ▁▁▁▁▁▁▁▁ ▁if ▁( need le . length ▁== ▁ 0 ) ▁{ ▁▁▁▁▁▁▁▁▁▁▁▁ ▁return ▁ 0 ; ▁▁▁▁▁▁▁▁ ▁} ▁▁▁▁▁▁▁▁ ▁int ▁char Table [] ▁= ▁make Char Table ( need le ); ▁▁▁▁▁▁▁▁ ▁int ▁offset Table [] ▁= ▁make Offset Table ( need le ); ▁▁▁▁▁▁▁▁ ▁for ▁( int ▁i ▁= ▁need le . length ▁- ▁ 1 , ▁j ; ▁i ▁< ▁hay stack . length ; ) ▁{ ▁▁▁▁▁▁▁▁▁▁▁▁ ▁for ▁( j ▁= ▁need le . length ▁- ▁ 1 ; ▁need le [ j ] ▁== ▁hay stack [ i ]; ▁-- i , ▁-- j ) ▁{ ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ ▁if ▁( j ▁== ▁ 0 ) ▁{ ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ ▁▁▁▁ ▁return ▁i ; ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ ▁} ▁▁▁▁▁▁▁▁▁▁▁▁ ▁} ▁▁▁▁▁▁▁▁▁▁▁▁ ▁// ▁i ▁+= ▁need le . length ▁- ▁j ; ▁// ▁For ▁na ive ▁method ▁▁▁▁▁▁▁▁▁▁▁▁ ▁i ▁+= ▁Math . max ( offset Table [ need le . length ▁- ▁