Вступление
Ранее я создал две задачи, в которых идея состоит в том, чтобы реконструировать объект, используя как можно меньше операций типа запроса; это будет третий.
Задание
Ваши входные данные должны быть непустой строкой S
над алфавитом abc
и его длиной, а ваши выходные данные должны быть S
. Без ограничений это, конечно, тривиальная задача; подвох в том, что вам не разрешен S
прямой доступ . Единственное, что вам разрешено делать, S
это вызывать функцию num_occur(T, S)
, где T
находится какая-то другая строка, и num_occur
подсчитывает количество вхождений T
in S
. Перекрывающиеся экземпляры считаются различными, поэтому на num_occur(T, S)
самом деле возвращает количество индексов i
, так что
S[i, i+1, …, i+length(T)-1] == T
Например, num_occur("aba", "cababaababb")
вернется 3
. Обратите внимание также, что num_occur(S, S)
вернется 1
. Результат num_occur("", S)
не определен, и вы не должны вызывать функцию с пустой строкой.
Короче говоря, вы должны написать функцию или программу, которые принимают S
и в length(S)
качестве входных данных, вызывают num_occur
несколько более коротких строк и S
несколько раз, восстанавливают S
эту информацию и возвращают ее.
Правила и оценки
Ваша цель - написать программу, которая будет делать num_occur
как можно меньше звонков . В этом хранилище вы найдете файл с именем abc_strings.txt
. Файл содержит 100 строк, каждая в своей строке, между длинами 50 и 99. Ваша оценка - это общее количество обращений к num_occur
этим входам , причем более низкая оценка лучше. Ваше решение предпочтительно будет отслеживать этот номер во время работы и распечатывать его по окончании. Строки генерируются путем выбора равномерно случайных букв из abc
; Вы можете оптимизировать этот метод генерации строк, но не сами строки.
Ограничения по времени нет, за исключением того, что вы должны запустить свое решение в тестовых случаях перед его отправкой. Ваше решение должно работать для любого корректного ввода S
, а не только для тестовых случаев.
Вам также рекомендуется поделиться своей реализацией num_occur
, если вы не используете чужую. Чтобы начать работу, вот реализация на Python:
def num_occur(needle, haystack):
num = 0
for i in range(len(haystack) - len(needle) + 1):
if haystack[i : i + len(needle)] == needle:
num += 1
return num
источник
S
или только для тестовых случаев?all non-empty strings
какой длины?Ответы:
Javascript,
14325 14311звонковМы начинаем с пустой строки и идем рекурсивно, добавляя новую букву в конце или в начале текущей строки, пока у нас еще есть хотя бы одно совпадение.
Все предыдущие результаты
numOccur()
сохраняются вsym
объекте, и мы используем эти данные, чтобы немедленно отклонить любую новую строку, которая не может быть кандидатом.РЕДАКТИРОВАТЬ : потому что мы всегда начинаем с
'a'
, мы всегда знаем точное числоa
в строке. Мы используем эту информацию, чтобы завершить процесс раньше, когда обнаруживаем, что отсутствует только последовательностьa
. Также исправлено регулярное выражение, которое было неверно в Chrome и IE.Полный исполняемый фрагмент ниже.
Показать фрагмент кода
источник
Python, 15205 звонков
Это представление, скорее всего, неоптимально, поскольку оно использует только
num_occur
для проверки, является ли строка подстрокойS
, и никогда не использует ее для фактического подсчета количества подстрок.Алгоритм работает, сохраняя строку,
current
которая построена, чтобы быть равнойS
в конце. Вот все шаги в алгоритме:Мы устанавливаем
current
равным''
Просмотрите каждую букву в алфавите и сделайте следующее:
2.1. Создайте новую строку
current_new
и установите для нее значение,current
за которым следует буква.2.2. Проверьте,
current_new
включен ли онS
, запустивnum_occur
его, и посмотрите, будет ли результат больше единицы.2,3. Если
current_new
включена вS
, наборcurrent
кcurrent_new
и вернуться к шагу 2. В противном случае, мы переходим к следующему письму.Если длина
current
равна длинеS
мы можем сказать, что мы сделали. Иначе, мы вернемся к шагу 2, но изменим шаг 2.1, чтобы сделать егоcurrent_new
равным букве, за которой следуетcurrent
вместо. Когда мы снова достигаем этого шага, мы закончили.источник
Python 2,
1495214754 звонковОчень похоже на первый ответ, но не пробует следующие символы, которые приводят к невозможным подстрокам, которые:
мы знаем из того,
num_occur
что они не встречаются в цели (из предыдущих вызовов)мы уже использовали подстроку чаще, чем это происходит в соответствии с
num_occur
(добавим подсчет подстрок за минуту)сделаноисточник
Python
1270512632 звонковЯ использовал функцию скелета Loovjo. Я никогда не пишу в Python
РЕДАКТИРОВАТЬ:
Добавлен код для строк длиной в один символ
Добавлен код для отклонения уже сопоставленных образцов
источник