如何在回文中附加和加入中心元素(如果出现多次)

时间:2019-04-02 16:34:20

标签: python-3.x algorithm list dictionary palindrome

我想根据用户输入的字符串按字典顺序创建回文

我输入输入字符串并计算每个字母的出现(奇数或偶数),并将它们相应地存储在字典中。然后,找到中心元素,并以排序的方式存储左右部分。

现在,当中心元素出现多次时,如何继续?

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时, 输出应该是crocroc, 但是我被困在orcrc中。

1 个答案:

答案 0 :(得分: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)