input: class StringComparator:
      def __init__(self, string1, string2):
          self.string1 = string1
          self.string2 = string2
      
      def is_equal(self):
          return self.string1 == self.string2
      
      def is_different(self):
          return self.string1 != self.string2
      
      def is_similar(self, threshold=0.5):
          distance = edit_distance(self.string1, self.string2)
          max_length = max(len(self.string1), len(self.string2))
          return distance / max_length < threshold
  
  # Example usage:
  # >>> comparator = StringComparator("hello", "hello")
  # >>> comparator.is_equal()
  # True
  # >>> comparator.is_different()
  # False
  # >>> comparator.is_similar()
  # True
  
  # >>> comparator = StringComparator("hello", "hallo")
  # >>> comparator.is_equal()
  # False
  # >>> comparator.is_different()
  # True
  # >>> comparator.is_similar()
  # True
  
  # >>> comparator = StringComparator("hello", "world")
  # >>> comparator.is_equal()
  # False
  # >>> comparator.is_different()
  # True
  # >>> comparator.is_similar()
  # False
output:     
  def edit_distance(s1, s2):
      if len(s1) < len(s2):
          return edit_distance(s2, s1)
  
      if len(s2) == 0:
          return len(s1)
  
      previous_row = range(len(s2) + 1)
      for i, c1 in enumerate(s1):
          current_row = [i + 1]
          for j, c2 in enumerate(s2):
              insertions = previous_row[j + 1] + 1
              deletions = current_row[j] + 1
              substitutions = previous_row[j] + (c1 != c2)
              current_row.append(min(insertions, deletions, substitutions))
          previous_row = current_row
      
      return previous_row[-1]
  