                          1))))))
     (subsolution (.length s1) (.length s2))))
 
-(defn- hamming-distance [s1 s2]
+(defn- hamming-distance [^String s1 ^String s2]
   (+
    (reduce + (map #(if (= %1 %2) 0 1) s1 s2))
    (- (max (.length s1) (.length s2))

     (common-suffix s1 s2)
     (->> s1
          reverse
          (map #(when (or (= %1 %2)
                          (= (Character/toUpperCase %1) %2)
                          (= (Character/toLowerCase %1) %2))
                  %1)
               (reverse s2))
          (take-while (complement nil?))
          (apply str)
          reverse))))

    (if (> (.length s) (max 3 (- len 3)))
      (str (.substring s 0 (- len 3)) "...")
      s)))

(defn- char-equal-ignore-case
  [^Character c1 ^Character c2]
  (when (or (= c1 c2)
            (= (Character/toUpperCase c1) c2)
            (= (Character/toLowerCase c1) c2))
    c1))

(defn ^String common-prefix
  "Return the longest common prefix of s1 and s2."
