LeetCode 763. Partition Labels in F#

URL

leetcode.com/problems/partition-labels

Code

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

let partitionLabels (s: string) : int list =
    let rec lastPos xs m =
        match xs with
        | [] -> m
        | (i, h) :: t -> lastPos t (Map.add h i m)

    let rec partitionLabels' (cs: (int * char) list) (lastPos: Map<char, int>) curMax prev acc =
        match cs with
        | [] -> acc |> List.rev
        | (i, h) :: t ->
            let curMax = System.Math.Max(curMax, Map.find h lastPos)

            if i = curMax then
                let len = i - prev
                partitionLabels' t lastPos curMax i (len :: acc)
            else
                partitionLabels' t lastPos curMax prev acc

    let cs = s |> Seq.toList |> List.mapi (fun i c -> i, c)
    let lastPos = lastPos cs Map.empty
    partitionLabels' cs lastPos -1 -1 []