题目1 :基础练习 完美的代价
解题思路
贪心算法
- 判断能不能变成回文数
- 找贪心策略,交换最少。参考链接
代码
# 判断回文
def is_pal(N, listStr):
count = 0
for i in range(26):
if listStr.count(chr(ord('a') + i)) % 2 != 0:
count += 1
if count > 1:
print("Impossible")
return False
return True
# 计数
def count_step(n, li):
ans = 0
reli = li[::-1] # 使用倒序 容易计算 索引
for i in range(n//2):
if li.count(li[i]) != 1: # 偶数
temp = reli[:n-i].index(li[i]) # 计算交换步数
reli.pop(temp) # 删除(步数和索引数相同)
ans += temp
li = reli[::-1] # 更新列表
else: # 奇数,直接放中间
ans += n//2 - i # 计算步数
li[i] = None # 相当于删除,但是要占位,因为pop的话,循环里的 i 就对应不上了
reli = li[::-1] # 倒序
return ans
N = int(input())
listStr = list(input())
if is_pal(N, listStr):
print(count_step(N, listStr))