LeetCode 1268. Search Suggestions System in F#

URL

leetcode.com/problems/search-suggestions-sy..

Code

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

open System

type Trie =
    { table: Map<char, Trie>
      candidates: Set<string> }

    static member empty() : Trie =
        { table = Map.empty
          candidates = Set.empty }

let insertToTrie (word: string) (trie: Trie) : Trie =
    let rec insertToTrie' (cs: char list) word (trie: Trie) =
        match cs with
        | [] -> Trie.empty ()
        | h :: t ->
            let next =
                match Map.tryFind h trie.table with
                | None -> (Trie.empty ())
                | Some (v) -> v

            let trie' = insertToTrie' t word next

            let trie'' =
                { trie' with candidates = Set.add word trie'.candidates }

            { trie with table = Map.add h trie'' trie.table }

    insertToTrie' (word |> Seq.toList) word trie

let suggestedProducts (products: string list) (searchWord: string) : string list list =
    let rec suggestedProducts' (cs: char list) (trie: Trie) acc =
        match cs with
        | [] -> acc |> List.rev
        | h :: t ->
            match Map.tryFind h trie.table with
            | None -> suggestedProducts' t (Trie.empty ()) ([] :: acc)
            | Some (v) ->
                let len = Math.Min(3, Set.count v.candidates)

                let cands =
                    v.candidates
                    |> Set.toList
                    |> List.sort
                    |> List.take len

                suggestedProducts' t v (cands :: acc)

    let trie =
        products
        |> List.fold (fun acc word -> insertToTrie word acc) (Trie.empty ())

    suggestedProducts' (searchWord |> Seq.toList) trie []