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