LeetCode 345. Reverse Vowels of a String in F#

URL

leetcode.com/problems/reverse-vowels-of-a-s..

Code

github.com/syohex/dotnet-study/blob/master/..

let reverseVowels (s: string) : string =
    let isVowel (c: char) : bool =
        let c = System.Char.ToLower(c)

        c = 'a'
        || c = 'e'
        || c = 'i'
        || c = 'o'
        || c = 'u'

    let rec nextVowel pos (cs: char []) checkFn nextStep =
        if checkFn pos then
            if isVowel cs.[pos] then
                pos
            else
                nextVowel (pos + nextStep) cs checkFn nextStep
        else
            pos

    let rec reverseVowels' left right (cs: char []) =
        if left >= right then
            cs |> System.String
        else
            let left' = nextVowel left cs (fun n -> n < cs.Length) 1
            let right' = nextVowel right cs (fun n -> n >= 0) -1

            if left' < right' then
                let tmp = cs.[left']
                cs.[left'] <- cs.[right']
                cs.[right'] <- tmp
                reverseVowels' (left' + 1) (right' - 1) cs
            else
                cs |> System.String

    reverseVowels' 0 (s.Length - 1) (s |> Seq.toArray)