Longest palindromic substrings: Difference between revisions

Realize in F#
(Realize in F#)
Line 8:
<br><br>
 
=={{header|F_Sharp|F#}}==
===Mahacher Function===
<lang fsharp>
// Mahacher Function. Nigel Galloway: October 1st., 2020
let Mahacher(s:string) = let oddP,evenP=Array.zeroCreate s.Length,Array.zeroCreate s.Length
let rec fN i g e (l:int[])=match g>=0 && e<s.Length && s.[g]=s.[e] with true->l.[i]<-l.[i]+1; fN i (g-1) (e+1) l |_->()
let rec fGo n g Ʃ=match Ʃ<s.Length with
false->oddP
|_->if Ʃ<=g then oddP.[Ʃ]<-min (oddP.[n+g-Ʃ]) (g-Ʃ)
fN Ʃ (Ʃ-oddP.[Ʃ]-1) (Ʃ+oddP.[Ʃ]+1) oddP
match (Ʃ+oddP.[Ʃ])>g with true->fGo (Ʃ-oddP.[Ʃ]) (Ʃ+oddP.[Ʃ]) (Ʃ+1) |_->fGo n g (Ʃ+1)
let rec fGe n g Ʃ=match Ʃ<s.Length with
false->evenP
|_->if Ʃ<=g then evenP.[Ʃ]<-min (evenP.[n+g-Ʃ]) (g-Ʃ)
fN Ʃ (Ʃ-evenP.[Ʃ]) (Ʃ+evenP.[Ʃ]+1) evenP
match (Ʃ+evenP.[Ʃ])>g with true->fGe (Ʃ-evenP.[Ʃ]+1) (Ʃ+evenP.[Ʃ]) (Ʃ+1) |_->fGe n g (Ʃ+1)
(fGo 0 -1 0,fGe 0 -1 0)
</lang>
===The Task===
<lang fsharp>
let fN g=if g=[||] then (0,0) else g|>Array.mapi(fun n g->(n,g))|>Array.maxBy snd
let lpss s=let n,g=Mahacher s in let n,g=fN n,fN g in if (snd n)*2+1>(snd g)*2 then s.[(fst n)-(snd n)..(fst n)+(snd n)] else s.[(fst g)-(snd g)+1..(fst g)+(snd g)]
let test = ["three old rotators"; "never reverse"; "stable was I ere I saw elbatrosses"; "abracadabra"; "drome"; "the abbatial palace"; ""]
test|>List.iter(fun n->printfn "A longest palindromic substring of \"%s\" is \"%s\"" n (lpss n))
</lang>
{{out}}
<pre>
A longest palindromic substring of "three old rotators" is "rotator"
A longest palindromic substring of "never reverse" is "ever reve"
A longest palindromic substring of "stable was I ere I saw elbatrosses" is "table was I ere I saw elbat"
A longest palindromic substring of "abracadabra" is "aca"
A longest palindromic substring of "drome" is "d"
A longest palindromic substring of "the abbatial palace" is "abba"
A longest palindromic substring of "" is ""
</pre>
=={{header|Go}}==
{{trans|Wren}}
2,172

edits