#python-3.x #algorithm #list #dictionary #palindrome
#python-3.x #алгоритм #Список #словарь #палиндром
Вопрос:
Я хочу создать палиндром лексикографически из строки пользовательского ввода
Я беру входную строку и подсчитываю вхождение каждого алфавита (четное или нечетное) и сохраняю их соответственно в словаре. Затем я нахожу центральный элемент, а также сохраняю левую и правую части отсортированным образом.
Теперь, как мне продолжить, когда центральный элемент встречается несколько раз?
from collections import Counter
even={}
odd={}
s=input()
s=list(s)
s.sort()
s=Counter(s)
for i,j in s.items():
if j%2==0:
even.update({i:j})
else:
odd.update({i:j})
print(even,odd)
od=list(odd)
ev=list(even)
if len(odd)==1:
center=od[0]
elif len(odd)>1:
print('Not Possible')
elif len(odd)==0:
center=''
right=[]
for i,j in even.items():
right.append(i*int(j/2))
print(right)
left=right[::-1]
print(left)
pal=right list(center) left
palin=''.join(pal)
print(palin)
Например, когда входные данные являются crocorc,
Вывод должен быть corcroc,
Но я застрял в orcrc.
Ответ №1:
Вы можете проверить наличие нескольких вхождений центрального элемента и добавить дополнительные элементы в четный список:
if odd[od[0]] > 1:
even[od[0]] = odd[od[0]] - 1
Мы делаем -1
, потому что мы должны использовать один элемент в качестве центрального элемента.
Теперь проблема будет в том, что even
не будет отсортирован, поэтому вам нужно отсортировать его.
even = sorted(even.items(), key=lambda kv: kv[0])
import collections
even = collections.OrderedDict(even)
Первая строка кода выше сортирует even
, которая возвращает список кортежей, а третья строка преобразует его обратно в словарь.
Вот готовый код
from collections import Counter
even={}
odd={}
s=input()
s=list(s)
s.sort()
s=Counter(s)
for i,j in s.items():
if j%2==0:
even.update({i:j})
else:
odd.update({i:j})
print(even,odd)
od=list(odd)
ev=list(even)
if len(odd)==1:
center=od[0]
elif len(odd)>1:
print('Not Possible')
elif len(odd)==0:
center=''
if odd[od[0]] > 1:
even[od[0]] = odd[od[0]] - 1
right=[]
even = sorted(even.items(), key=lambda kv: kv[0])
import collections
even = collections.OrderedDict(even)
for i,j in even.items():
right.append(i*int(j/2))
print(right)
left=right[::-1]
print(left)
pal=right list(center) left
palin=''.join(pal)
print(palin)