# Count number of changes (manipulations) needed to make an anagram in immutable/pure functional Scala with foldLeft and a MultiSet

## Algorithm goal

Count number of changes needed to make. This problem is similar to:

• On HackerRank: You must split it [a string] into two contiguous substrings, then determine the minimum number of characters to change to make the two substrings into anagrams of one another.

One string is an anagram of another if they have the same number of each character, not necessarily in the same order - for example abcc is an anagram of accb and vice-versa.

ab is composed of a and b, and exchanging a to b is enough to create an anagram - ie 1 change of letter is enough.

abc is not possible to create anagrams of because it cannot be split.

poeq requires 2 changes, to create an anagram, for example to pqpq, popo, eoeo and so forth.

## Explanation

Once we split a string into 2 parts, we are left with 2 strings. Number of changes required is effectively the number of characters that are not in common.

If we're counting a "difference" between two "sets", then we need a set differentiation operation. But this set is of a particular type - we have counters, so in fact it is a Map-like type. There is a name for it and it is a MultiSet (I discovered this while working out a solution for this problem). (this is © from www.scala-algorithms.com)

## Test cases in Scala

assert(anagramChanges("aaabbb") == Some(3))
assert(anagramChanges("ab") == Some(1))
assert(anagramChanges("mnop") == Some(2))
assert(anagramChanges("xyyx") == Some(0))
assert(anagramChanges("xaxbbbxx") == Some(1))
assert(anagramChanges("abc") == None)

def anagramChanges(input: String): Option[Int] = ???