LeetCode 567. Permutation in String in F#
URL
leetcode.com/problems/permutation-in-string
Code
github.com/syohex/dotnet-study/blob/master/..
let splitString (s: string) (len: int) : char list list =
let rec splitString' cs len acc =
if (List.length cs) < len then
acc |> List.rev
else
let v = cs |> List.take len
splitString' (List.tail cs) len (v :: acc)
let cs = s |> Seq.toList
splitString' cs len []
let strToIndexes (s: string) : int list =
s
|> Seq.toList
|> List.map (fun c -> (int c) - (int 'a'))
let charListToIndexes (cs: char list) : int list =
cs |> List.map (fun c -> (int c) - (int 'a'))
let toFreqTable (indexes: int list) : (int []) =
let rec toFreqTable' indexes (acc: int []) =
match indexes with
| [] -> acc
| head :: tail ->
acc.[head] <- acc.[head] + 1
toFreqTable' tail acc
toFreqTable' indexes (Array.init 26 (fun _ -> 0))
let equalFreqTable (a: int []) (b: int []) (len: int) : bool =
let rec equalFreqTable' (a: int []) (b: int []) i len =
if i > len then true
else if a.[i] <> b.[i] then false
else equalFreqTable' a b (i + 1) len
equalFreqTable' a b 0 len
let checkInclusion (s1: string) (s2: string) : bool =
let s1Len = Seq.length s1
let s1Table = strToIndexes s1 |> toFreqTable
let s2Tables =
splitString s2 s1Len
|> List.map (charListToIndexes >> toFreqTable)
s2Tables
|> List.tryFind (fun t -> equalFreqTable s1Table t s1Len)
|> Option.isSome