Удалить самый длинный общий префикс из списка путей - PullRequest
1 голос
/ 06 января 2020

У меня есть список путей

[]string{"/a/path/to/something", "/a/path/in/something", "/a/path/in/something/else"}

Я бы хотел удалить префикс Longest Common из всех путей, чтобы оставшаяся его часть была отдельной частью пути.

Для приведенного выше примера результат должен быть

[]string{"to/something", "in/something", "in/something/else"}

До сих пор моя попытка была довольно грубой:

  1. Разделить все пути на "/ "

    map [" / a / path / to / кое-что ": [путь к чему-то]," ": [путь во что-то]," / a / path / in / что-то / еще ": [путь во что-то еще]}

  2. Выберите любую запись на карте и используйте ее в качестве ссылки

  3. Перебирайте отдельные элементы этой выбранной записи и проверьте другие в этой позиции, если они соответствуют
  4. Если найден несоответствующий элемент, последовательность нарушается; взять оставшийся путь каждого пути из path[len(iterated_elem_so_far):]

Есть ли более изощренный способ сделать это?

1 Ответ

1 голос
/ 06 января 2020

То, что вы делаете, должно работать. Я не понимаю часть, касающуюся карты, поэтому вот алгоритм, который сначала находит самый длинный префикс, а затем удаляет его из всех путей:

func removeLargestPrefix(in []string) []string {
   // Store split paths in results
   results:=make([][]string,0,len(in))
   // Pick the first path as the longest prefix
   results=append(results,strings.Split(in[0],"/"))
   longest:=results[0]
   // cmp shortents the known longest prefix
   cmp:=func(a []string)  {
       if len(a)<len(longest) {
         longest=longest[:len(a)]
       }
       for i:=0;i<len(longest);i++ {
          if a[i]!=longest[i] {
             longest=longest[:i]
             return
          }
       }
   }
   // process all paths
   for i:=1;i<len(in);i++ {
       r:=strings.Split(in[i],"/")
       results=append(results,r)
       cmp(r)
   }
   // here, len(longest) is the length of the longest prefix
   out:=make([]string,0,len(results))
   for _,r:=range results {
      out=append(out,strings.Join(r[len(longest):],"/"))
   }
   return out
}

...