Проблема алгоритмики, строка python, нет идеи

89
10

У меня есть проблема с алгоритмом с Python и строками.


Моя проблема:


Моя функция должна суммировать максимальные значения подстроки.
Например:


ae-afi-re-fi -> 2+6+3+5=16
but
ae-a-fi-re-fi -> 2-10+5+3+5=5

Я пытаюсь использовать функцию string.count и подсчитывать подстроку, но этот метод не подходит.
Какой был бы лучший способ сделать это в Python? Спасибо заранее.


string = "aeafirefi"

Суммируйте значения подстрок.

спросил(а) 2021-01-25T20:10:01+03:00 5 месяцев назад
1
Решение
125

В моем решении я буду использовать модуль permutations из itertools, чтобы перечислить все возможные перестановки подстрок, которые вы указали в своем вопросе, представленном в dict под названием vals. Затем итерации по входной строке и разбиение строк на все перестановки, найденные ниже. Затем суммируем значения каждой перестановки и, наконец, получаем max.


PS: Ключом этого решения является метод get_sublists().


Это пример с некоторыми тестами:


from itertools import permutations 

def get_sublists(a, perm_vals):
# Find the sublists in the input string
# Based on the permutations of the dict vals.keys()
for k in perm_vals:
if k in a:
a = ''.join(a.split(k))
# Yield the sublist if we found any
yield k

def sum_sublists(a, sub, vals):
# Join the sublist and compare it to the input string
# Get the difference by lenght
diff = len(a) - len(''.join(sub))
# Sum the value of each sublist (on every permutation)
return sub , sum(vals[k] for k in sub) - diff * 10

def get_max_sum_sublists(a, vals):
# Get all the possible permutations
perm_vals = permutations(vals.keys())
# Remove duplicates if there is any
sub = set(tuple(get_sublists(a, k)) for k in perm_vals)
# Get the sum of each possible permutation
aa = (sum_sublists(a, k, vals) for k in sub)
# return the max of the above operation
return max(aa, key= lambda x: x[1])

vals = {'ae': 2, 'qd': 3, 'qdd': 5, 'fir': 4, 'afi': 6, 're': 3, 'fi': 5}

# Test
a = "aeafirefi"
final, s = get_max_sum_sublists(a, vals)
print("Sublists: {}\nSum: {}".format(final, s))
print('----')
a = "aeafirefiqdd"
final, s = get_max_sum_sublists(a, vals)
print("Sublists: {}\nSum: {}".format(final, s))
print('----')
a = "aeafirefiqddks"
final, s = get_max_sum_sublists(a, vals)
print("Sublists: {}\nSum: {}".format(final, s))

Вывод:


Sublists: ('ae', 'afi', 're', 'fi')
Sum: 16
----
Sublists: ('afi', 'ae', 'qdd', 're', 'fi')
Sum: 21
----
Sublists: ('afi', 'ae', 'qdd', 're', 'fi')
Sum: 1

Пожалуйста, попробуйте это решение со многими входными строками, как вы можете, и не стесняйтесь комментировать, если вы обнаружили какой-либо неправильный результат.

ответил(а) 2021-01-25T20:10:01+03:00 5 месяцев назад
46

Возможно наличие словаря с:
key = подстрока: value = значение


Итак, если у вас есть:

string = "aeafirefi"

сначала вы ищете всю строку в словаре, если вы ее не нашли, вы сокращаете последнее письмо, чтобы у вас была "aeafiref", пока не найдете подстроку или у вас есть единственная буква.


то вы пропустите используемые буквы: например, если вы нашли "aeaf", вы начинаете все сначала с помощью строки = "iref".

ответил(а) 2021-01-25T20:10:01+03:00 5 месяцев назад
45

Здесь решение грубой силы:


values_dict = {
'ae': 2,
'qd': 3,
'qdd': 5,
'fir': 4,
'afi': 6,
're': 3,
'fi': 5
}

def get_value(x):
return values_dict[x] if x in values_dict else -10

def next_tokens(s):
"""Returns possible tokens"""
# Return any tokens in values_dict
for x in values_dict.keys():
if s.startswith(x):
yield x

# Return single character.
yield s[0]

def permute(s, stack=[]):
"""Returns all possible variations"""

if len(s) == 0:
yield stack
return

for token in next_tokens(s):
perms = permute(s[len(token):], stack + [token])
for perm in perms:
yield perm

def process_string(s):
def process_tokens(tokens):
return sum(map(get_value, tokens))

return max(map(process_tokens, permute(s)))

print('Max: {}'.format(process_string('aeafirefi')))

ответил(а) 2021-01-25T20:10:01+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема