package Ġcom . qm uite am . editor Ċ Ċ import Ġandroidx . compose . ui . text . input . TextField Value Ċ import Ġjava . util .* Ċ Ċ enum Ġclass ĠWord Edit Action Ġ{ ĊĠĠĠ Ġinsert , Ġdelete , Ġrep ace Ċ } ĊĊ Ċ data Ġclass ĠWord Edit Point ( ĊĠĠĠ Ġval Ġaction : ĠWord Edit Action , ĊĠĠĠ Ġval Ġold Index : ĠInt , ĊĠĠĠ Ġval Ġnew Index : ĠInt Ċ ) Ċ Ċ class ĠWord Edit Result ( ĊĠĠĠ Ġval Ġdis : ĠInt , ĊĠĠĠ Ġval Ġlist : ĠList < Word Edit Point > Ċ ) Ċ Ċ private Ġclass ĠWord Edit Record Node ( val Ġpoint : ĠWord Edit Point ) Ġ{ ĊĊĠĠĠ Ġvar Ġprev : ĠWord Edit Record Node ? Ġ= Ġnull Ċ } Ċ Ċ private Ġclass ĠWord Edit Record ( ĊĠĠĠ Ġvar Ġdis : ĠInt Ċ ) Ġ{ ĊĠĠĠ Ġvar Ġnode : ĠWord Edit Record Node ? Ġ= Ġnull Ċ } Ċ Ċ fun Ġword Edit ( old TextField Value : ĠText FieldValue , Ġnew TextField Value : ĠText FieldValue ): ĠWord Edit Result Ġ{ ĊĠĠĠ Ġval Ġold Text Ġ= Ġold TextField Value . text ĊĠĠĠ Ġval Ġnew Text Ġ= Ġnew TextField Value . text ĊĠĠĠ Ġif ( old Text . length Ġ<= Ġ 2 0 Ġ|| Ġnew Text . length Ġ<= Ġ 2 0 ){ ĊĠĠĠĠĠĠĠ Ġreturn Ġword Edit ( old Text , Ġnew Text ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġprefix Check Length Ġ= Ġ 1 0 ĊĠĠĠ Ġvar Ġprefix Ġ= Ġ( old TextField Value . selection . start Ġ- Ġprefix Check Length ) ĊĠĠĠĠĠĠĠ Ġ. coerce At Most ( new TextField Value . selection . start Ġ- Ġprefix Check Length ) ĊĠĠĠĠĠĠĠ Ġ. coerce At Least ( 0 ) ĊĠĠĠ Ġwhile Ġ( prefix Ġ> Ġ 0 ){ ĊĠĠĠĠĠĠĠ Ġif ( old Text . substring ( 0 , Ġprefix ) Ġ== Ġnew Text . substring ( 0 , Ġprefix )){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprefix Check Length Ġ*= Ġ 2 ĊĠĠĠĠĠĠĠ Ġprefix Ġ= Ġ( prefix Ġ- Ġprefix Check Length ). coerce At Least ( 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġsuffix Check Length Ġ= Ġ 1 0 ĊĠĠĠ Ġvar Ġsuffix Ġ= Ġ( old Text . length Ġ- Ġold TextField Value . selection . end Ġ- Ġsuffix Check Length ) ĊĠĠĠĠĠĠĠ Ġ. coerce At Most ( new Text . length Ġ- Ġnew TextField Value . selection . end Ġ- Ġsuffix Check Length ) ĊĠĠĠĠĠĠĠ Ġ. coerce At Least ( 0 ) ĊĠĠĠ Ġwhile Ġ( suffix Ġ> Ġ 0 ){ ĊĠĠĠĠĠĠĠ Ġif ( old Text . substring ( old Text . length Ġ- Ġsuffix ) Ġ== Ġnew Text . substring ( new Text . length Ġ- Ġsuffix )){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuffix Check Length Ġ*= Ġ 2 ĊĠĠĠĠĠĠĠ Ġsuffix Ġ= Ġ( suffix Ġ- Ġsuffix Check Length ). coerce At Least ( 0 ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif ( prefix Ġ== Ġ 0 Ġ&& Ġsuffix Ġ== Ġ 0 ){ ĊĠĠĠĠĠĠĠ Ġreturn Ġword Edit ( old Text , Ġnew Text ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġword Edit ( ĊĠĠĠĠĠĠĠ Ġold Text . substring ( prefix , Ġold Text . length Ġ- Ġsuffix ), ĊĠĠĠĠĠĠĠ Ġnew Text . substring ( prefix , Ġnew Text . length Ġ- Ġsuffix ) ĊĠĠĠ Ġ) Ċ } Ċ Ċ fun Ġword Edit ( old Text : ĠString , Ġnew Text : ĠString , Ġshift : ĠInt Ġ= Ġ 0 ): ĠWord Edit Result Ġ{ ĊĠĠĠ Ġval Ġarray Ġ= ĠarrayOf Null s < Word Edit Record >( old Text . length Ġ+ Ġ 1 ) ĊĠĠĠ Ġval Ġnext Ġ= ĠarrayOf Null s < Word Edit Record >( old Text . length Ġ+ Ġ 1 ) ĊĠĠĠ Ġfor Ġ( j Ġin Ġarray . indices ) Ġ{ ĊĠĠĠĠĠĠĠ Ġarray [ j ] Ġ= ĠWord Edit Record ( j ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( j Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ= ĠWord Edit Record Node ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWord Edit Point ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWord Edit Action . delete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshift Ġ+ Ġj Ġ- Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Ġ= Ġarray [ j Ġ- Ġ 1 ] !!. node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġfor Ġ( i Ġin Ġnew Text . indices ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġarray . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolumn Last Ġ= Ġarray [ j ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( j Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext [ j ] Ġ= ĠWord Edit Record ( column Last . dis Ġ+ Ġ 1 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ= ĠWord Edit Record Node ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWord Edit Point ( Word Edit Action . insert , Ġshift Ġ+ Ġj Ġ- Ġ 1 , Ġshift Ġ+ Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Ġ= Ġcolumn Last . node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath 1 Ġ= ĠWord Edit Record ( column Last . dis Ġ+ Ġ 1 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ= ĠWord Edit Record Node ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWord Edit Point ( Word Edit Action . insert , Ġshift Ġ+ Ġj Ġ- Ġ 1 , Ġshift Ġ+ Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Ġ= Ġcolumn Last . node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrow Last Ġ= Ġnext [ j Ġ- Ġ 1 ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath 2 Ġ= ĠWord Edit Record ( row Last . dis Ġ+ Ġ 1 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ= ĠWord Edit Record Node ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWord Edit Point ( Word Edit Action . delete , Ġshift Ġ+ Ġj Ġ- Ġ 1 , Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Ġ= Ġrow Last . node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdiagonal Last Ġ= Ġarray [ j Ġ- Ġ 1 ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath 3 Ġ= Ġif Ġ( new Text [ i ] Ġ== Ġold Text [ j Ġ- Ġ 1 ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiagonal Last ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWord Edit Record ( diagonal Last . dis Ġ+ Ġ 1 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ= ĠWord Edit Record Node ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWord Edit Point ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWord Edit Action . rep ace , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj Ġ- Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Ġ= Ġdiagonal Last . node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmin Path Ġ= Ġpath 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( path 2 . dis Ġ< Ġmin Path . dis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Path Ġ= Ġpath 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( path 3 . dis Ġ< Ġmin Path . dis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Path Ġ= Ġpath 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext [ j ] Ġ= Ġmin Path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġarray . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ j ] Ġ= Ġnext [ j ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġret Ġ= Ġarray [ array . size Ġ- Ġ 1 ] !! ĊĠĠĠ Ġval Ġlist Ġ= ĠLinkedList < Word Edit Point >() ĊĠĠĠ Ġvar Ġnode Ġ= Ġret . node ĊĠĠĠ Ġwhile Ġ( node Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlist . add First ( node !!. point ) ĊĠĠĠĠĠĠĠ Ġnode Ġ= Ġnode ?. prev ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠWord Edit Result ( ret . dis , Ġlist ) Ċ }