code: private double compare_(String s1, String s2) {
      // before we begin, note the length of the strings
      int shortlen = Math.min(s1.length(), s2.length());
      int longlen = Math.max(s1.length(), s2.length());
      
      int removed = 0; // total length of common substrings
      while (true) {
        // first, we identify the longest common substring
        int longest = 0;
        int longesti = 0;
        int longestj = 0;
      
        int[][] matrix = new int[s1.length()][s2.length()];
        for (int i = 0; i < s1.length(); i++) {
          for (int j = 0; j < s2.length(); j++) {
            if (s1.charAt(i) == s2.charAt(j)) {
              if (i == 0 || j == 0)
                matrix[i][j] = 1;
              else
                matrix[i][j] = matrix[i - 1][j - 1] + 1;
  
              if (matrix[i][j] > longest) {
                longest = matrix[i][j];
                longesti = i;
                longestj = j;
              }
            } else
              matrix[i][j] = 0;
          }
        }
  
        longesti++; // this solves an off-by-one problem
        longestj++; // this solves an off-by-one problem
  
        // at this point we know the length of the longest common
        // substring, and also its location, since it ends at indexes
        // longesti and longestj.
  
        if (longest < minlen)
          break; // all remaining common substrings are too short, so we stop
  
        // now we slice away the common substrings
        s1 = s1.substring(0, longesti - longest) + s1.substring(longesti);
        s2 = s2.substring(0, longestj - longest) + s2.substring(longestj);
        removed += longest;
      }
  
      return formula.compute(removed, shortlen, longlen);
    }
docs: FIXME: speed this up by using a one-dimensional array