资源限制
内存限制:512.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
交换的定义是:交换两个相邻的字符
例如mamad
第一次交换 ad : mamda
第二次交换 md : madma
第三次交换 ma : madam (回文!完美!)
输入格式
第一行是一个整数N,表示接下来的字符串的长度(N <= 8000)
第二行是一个字符串,长度为N.只包含小写字母
输出格式
如果可能,输出最少的交换次数。
否则输出Impossible
样例输入
5
mamad
样例输出
3
n = int(input())
s = input()
dic = {} # 字典存储每个字符出现的次数
for i in s:
dic[i] = dic.get(i, 0) + 1
du = 0 # 只出现1次的字符个数
du_s = ""
for i in dic:
if dic[i] % 2 == 1:
du_s = i
du += 1
if du > 1: # 大于1则不可能完美
print("Impossible")
else:
list1 = [] # 用数组存放每个字符便于操作
for i in range(n):
list1.append(s[i])
steps = 0
for i in range(int(n / 2)): # 然后遍历前半部分一次调整一个字符的位置
# print("i=", i)
fount_s = list1[i]
if fount_s == du_s and dic[du_s] == 1: # 如果当前就是剩余的那个字符,并且此字符只剩一个没排,那就将字符串倒过来从另一边继续
list1 = list1[::-1]
fount_s = list1[i]
if fount_s == du_s and dic[du_s] > 1: # 如果当前就是剩余的那个字符,但是此字符还有不止一个没排,那就走正常流程,但是该字符的数量减2
dic[du_s] -= 2
later1 = n - i - 1
later = n - (list1[-1 - i:i - n:-1].index(fount_s) + i + 1)
if later == later1:
continue
else:
list1.pop(later)
list1.insert(later1, fount_s)
steps += later1 - later
print(steps)