Как добавить и объединить центральный элемент (при повторном использовании) в палиндроме

#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)