Guest User

Untitled

a guest
Nov 14th, 2016
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 1.49 KB | None | 0 0
  1. module type MultiSet_S = sig
  2.   type 'a t
  3.   val empty : 'a t
  4.   val occurrences : 'a t -> 'a -> int
  5.   val insert : 'a t -> 'a -> 'a t
  6.   val remove : 'a t -> 'a -> 'a t
  7. end
  8.  
  9. module MultiSet:MultiSet_S =
  10. struct
  11.   type 'a t = | Empty | Node of ('a * int * 'a t)
  12.  
  13.   let empty = Empty
  14.  
  15.   let rec occurrences c e =
  16.     match c with
  17.     | Empty -> 0
  18.     | Node(elem, v, next) ->
  19.       if e = elem
  20.       then
  21.         v
  22.       else
  23.         occurrences next e
  24.  
  25.   let rec insert c e =
  26.     match c with
  27.     | Empty -> Node(e, 1, Empty)
  28.     | Node(elem, v, next) ->
  29.       if elem = e
  30.       then
  31.         Node(elem, v + 1, next)
  32.       else
  33.         Node(elem, v, (insert next e))
  34.  
  35.   let rec remove c e =
  36.     match c with
  37.     | Empty -> Empty
  38.     | Node(elem, v, next) ->
  39.       if elem = e
  40.       then
  41.         if v > 1
  42.         then
  43.           Node(elem, v - 1, next)
  44.         else
  45.           next
  46.       else
  47.         Node(elem, v, (insert next e))
  48. end
  49.  
  50. let explode s =
  51.   let rec exp i l =
  52.     if i < 0 then l else exp (i - 1) (s.[i] :: l) in
  53.   exp (String.length s - 1) [];;
  54.  
  55. let letters word =
  56.   let chars = explode word in
  57.   List.fold_left (fun m c -> MultiSet.insert m c) MultiSet.empty chars;;
  58.  
  59. let anagram word1 word2 =
  60.   let rec compare ms chars =
  61.     match ms, chars with
  62.     | MultiSet.Empty, []   -> true             (* Unbound constructor Empty)
  63.     | MultiSet.Node (_, _, next), _ :: cs ->
  64.       compare next cs
  65.     | _ -> false in
  66.   compare (letters word1) (explode word2);;
Add Comment
Please, Sign In to add comment