O жаркое решение O (nk) (n = размер ввода, k = основание ваших цифр), основанный на ответе Стефана Кендалла выше, но с пониманием, что вы, вероятно, должны быть жадными и использовать целое число, у вас больше всего первый. Я не уверен, что он работает на всех входах, но я изо всех сил пытался подумать о примере, где жадность потерпит неудачу, и еще не нашел его. Предупреждение: cruddy python впереди - я сделал это быстро и грязно, а не красиво.
Проверьте цифра может быть использована с учетом текущего состояния:
def ok(s, n, v):
l = len(s)
if l < n:
n = l
if n < 1:
return True
if str(v) in s[-n:]:
return False
return True
Helper, который делает всю работу - цикл по графам, найти один с максимальным числом повторений слева, который можно использовать, и выберите Это. Повторение.
def go(counts, n):
output = ""
max = 0
more = True
while max >= 0:
max = -1
pos = -1
more = False
for i in range(10):
if counts[i] > 0:
more = True
if counts[i] > max and counts[i] > 0 and ok(output, n, i):
max = counts[i]
pos = i
if max < 0:
if more:
return "No solution"
return output
counts[pos] = counts[pos] - 1
output = output + str(pos)
Основная функция:
def blockify(s, fold):
counts = [0,0,0,0,0,0,0,0,0,0]
for letter in s:
counts[int(letter)] = counts[int(letter)] +1
return go(counts, fold)
Я чувствую, что там, наверное, контрпример, что это не поможет, но я не могу думать об одном.
Звучит как домашнее задание .. – MindStalker
Интересно, что тег Homework был добавлен, а затем удален. –
домашняя работа была добавлена по ошибке. В интервью кому-то был задан этот вопрос. – user237080