Leetcode 438. Find All Anagrams in a String in F#

URL

leetcode.com/problems/find-all-anagrams-in-..

Code

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

let equalArray a b =
    (a, b)
    ||> Array.zip
    |> Array.forall (fun (x, y) -> x = y)

let slices (count: int) (a: char []) =
    let rec slices' count a n acc =
        if n + count > (Array.length a) then
            acc |> List.rev
        else
            slices' count a (n + 1) (a.[n..n + count - 1] :: acc)

    slices' count a 0 []

let sliceToTable (cs: char []) : int [] =
    cs
    |> Array.map (fun c -> int c - int 'a')
    |> Array.fold
        (fun table i ->
            table.[i] <- table.[i] + 1
            table)
        (Array.zeroCreate 26)

let findAnagrams (s: string) (p: string) : int list =
    if (Seq.length s) < (Seq.length p)
    then
        []
    else
        let pTable = p |> Seq.toArray |> sliceToTable

        let sTables =
            s
            |> Seq.toArray
            |> slices (Seq.length p)
            |> List.map sliceToTable

        sTables
        |> List.mapi (fun i t -> (i, t))
        |> List.filter (fun (_, t) -> equalArray t pTable)
        |> List.map (fun (i, _) -> i)