I tried the binary search approach but it was still much slower than my best 
version on my test data.

For reference, here's what I tried: 
    
    
    proc commonPrefix*(paths: openArray[string], sep = "/"): string =
      if len(paths) < 1:
        return ""
      let first = paths[0]
      if len(first) < 2:
        return first
      var lo = 0
      var hi = foldl(paths.mapIt(len(it)), min(a, b)) - 1 # min len
      while lo <= hi:
        let mid = lo + (hi - lo) div 2
        var ok = true
        block loop:
          for s in paths[1 .. ^1]:
            for i in lo .. mid:
              if s[i] != first[i]:
                ok = false
                break loop
        if ok:
          result.add(first[lo .. mid])
          lo = mid + 1
        else:
          hi = mid - 1
    
    
    Run

Reply via email to