Вычесть строку формата из заданных результатов

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

Например, вот ввод:

"the fox jumps over the lazy brown dog"
"the man jumps over the lazy black cat"
"the dolphin jumps over the big wave"

=> вывод:

output = "the {} jumps over the {}"

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

так как в питоне у нас есть:

"the fox jumps over the lazy brown dog" = output.format('fox', 'lazy brown dog')
"the man jumps over the lazy black cat" = output.format('man ', 'lazy black cat')
"the dolphin jumps over the big wave" = output.format('dolphin', 'big wave')

или даже лучше в C, предполагая, что с достаточным количеством входных данных мы можем получить

output = "the %s jumps over the %s"
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Насколько мне известно, в стандартных библиотеках такого алгоритма нет. Мы можем рассматривать это как вариант задачи о самой длинной общей подстроке, вот идея, как это сделать.

Наивный алгоритм будет примерно таким:

1. Split the first string, with ' ' (space) as split character and keep this array
   (base_array)

2. For each following input :
    a. Split string with ' ' as split character, let's call this array curr_array

    b. Compare, from left to right, each curr_array entry with the base_array entries and 
       apply the following rule: 
         - match at curr_array[i] and base_array[j]:
               compare curr_array[i+1] and base_array[j+1]

         - no match at curr_array[i] and base_array[j]:
               recurse b. with curr_array[i+1] and base_array[j], if recursion found a
               match at curr_array[i+k], continue algorithm from the top of the recursion
               from curr_array[i+k+1] and base_array[j+1],

               if recursion was not successful update base_array[j] = "" and continue
               algorithm with curr_array[i] and base_array[j+1]

Допустим, у вас есть два входа:

"this is a very poor and long example"
"this is a good and short example"

Когда алгоритм завершится, base_array будет содержать такие записи:

[this][is][a][][][and][][example]

Затем просто перегруппируйте соседние пустые записи:

[this][is][a][][and][][example]

Замените оставшиеся пустые записи символами по вашему выбору и присоединитесь к списку, чтобы получить желаемый результат.

this is a {} and {} example

Надеюсь, это помогло!

Это помогло. Я также нашел инструмент, который работает для моей конкретной проблемы: git diff --word-diff который использует алгоритм, аналогичный приведенному выше.

Neyugn 26.12.2020 10:06

Другие вопросы по теме