基础练习 完美的代价
问题描述
回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回
文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该
串变成一个完美的回文串。
交换的定义是:交换两个相邻的字符
例如mamad
第一次交换 ad : mamda
第二次交换 md : madma
第三次交换 ma : madam (回文!完美!)
输入格式
第一行是一个整数N,表示接下来的字符串的长度(N <= 8000)
第二行是一个字符串,长度为N.只包含小写字母
输出格式
如果可能,输出最少的交换次数。
否则输出Impossible
样例输入
5
mamad
样例输出
3
def ishuiwen(a,n):#判断是否能构成回文
b = [' ' for i in range(26)]
for i in range(26):
b[i]=(chr(97+i))
k=0
for i in range(26):
t=0
for j in range(n):
if b[i]==a[j]:
t+=1
if t%2!=0:
k+=1
if k>1:
return 0
else:
return 1
def change(a,n):
s=0
for i in range(n):
k=0
while a[i]!=a[n-k-i-1]:
k+=1
if k>0 and i!=n-k-1:
t=a[n-k-i-1]
a[n-k-i-1]=a[n-i-1]
a[n-i-1]=t
s+=1
elif k>0 and i==n-k-1:#出现单个字母的情况
t=a[int(n/2)]
a[int(n/2)]=a[i]
a[i]=t
s,i=s+1,i-1
for i in range(n):
print(a[i],end='')
print('\n')
return s
n = int(input())
a = input()
if ishuiwen(a,n):
b = []
for k in a:#python不能更改字符串中的某个元素,只能序列化为列表再更改
b.append(k)
print(change(b,n))
else:
print("Impossible")