# 题目
键盘输入一个整数以及一串字符,整数为输入字符的长度,判断该字符串移动字符后是否为回文字符串,如果不是输出Impossible!,否则输出字符移动的最小步数。
输入样例
5
mamad
输出样例
3
输入样例
4
abbc
输出样例
Impossible!
# 题目分析
1.首先,判断该字符串是否为回文串,分为两种情况:1)对于字符串长度为偶数的字符串,如果有字符出现的次数是奇数,则不是回文串;2)对于字符串长度为奇数的字符串,如果出现次数为奇数的字符的次数超过1次,那么也不是回文串。
2.其次,再确定是回文串后, 使用贪心策略计算需要移动的最小步数,只需判断一半的字符,遍历前一半每一个字符出现的次数是奇数还是偶数:1)找到倒叙序列中与正序序列中相同的字符,该字符在正序序列中的位置(即找到的字符在正序序列中的下标)就是要移动步数;2)将该下标加到总步数,然后pop倒叙序列中该下标字符;3)更新正序序列。如果出现的次数是奇数:1)因为已经确定是回文串,所以出现的次数只能为1,所以只需把该需要移动的字符移动到字符串中间,那么移动步数为(N // 2 - i),减去i是不知道该字符在什么位置,而且i的范围是(0,N//2);2)将当前字符中更改;3)更新倒序序列。
# 代码
def isHuiwen(N,s):
temp = set()
for i in range(26):
if (N % 2 == 0):
if s.count(chr(ord('a') + i)) % 2 != 0:
print("Impossible!")
return False
else:
return True
else:
for j in range(26):
if s.count(chr(ord('a') + j)) % 2 != 0:
temp.add(chr(ord('a') + j))
if len(temp) > 1:
print("Impossible!")
return False
else:
return True
def steps(N,s,s1,res):
for i in range(N//2):
if s[i:].count(s[i])!= 1:
temp = s1[:N-i].index(s[i])
res += temp
s1.pop(temp)
s = s1[::-1]
else:
res += N // 2 -i
s[i] = None
s1 = s[::-1]
return res
if __name__ == "__main__":
N = int(input())
s = list(input())
s1 = s[::-1]
res = 0
if isHuiwen(N, s):
print(steps(N, s,s1,res))