code: CharPriority[] reserveCharacters(char[] chars, char[] reservedCharacters) {
      if (reservedCharacters == null || reservedCharacters.length == 0) {
        CharPriority[] result = new CharPriority[chars.length];
        for (int i = 0; i < chars.length; i++) {
          result[i] = priorityLookupMap.get(chars[i]);
        }
        return result;
      }
      Set<Character> charSet = new LinkedHashSet<>(Chars.asList(chars));
      for (char reservedCharacter : reservedCharacters) {
        charSet.remove(reservedCharacter);
      }
  
      CharPriority[] result = new CharPriority[charSet.size()];
      int index = 0;
      for (char c : charSet) {
        result[index++] = priorityLookupMap.get(c);
      }
      return result;
    }
docs: Provides the array of available characters based on the specified arrays.
  @param chars The list of characters that are legal
  @param reservedCharacters The characters that should not be used
  @return An array of characters to use. Will return the chars array if
  reservedCharacters is null or empty, otherwise creates a new array.