一、题目
回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。现在给你一个字符串,他不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
交换的定义是:交换两个相邻的字符串
例:mamad
第一次交换ad:mamda
第二次交换md:madma
第三次交换ma:madam
输入格式:
第一行是一个整数N,表示接下来的字符串长度(N<=8000)
第二行是一个字符串,长度为N,只包含小写字母
输出格式:
如果可能,输出最少的交换次数。
否则输出impossible
二、例子
输入:
5
mamad
输出:
3
三、解析
输出impossible情况:
1.对于字符串长度是偶数的字符串,每个字符的数目出现奇数,输出impossible。
例:abbc
2.对于字符串长度是奇数的字符串,只能有一个字符数目是奇数,一旦出现两个,输出impossible.
例:abcbd
三、涉及的知识
- if-elif-else知识:蓝桥杯训练-字符串对比(day8)-CSDN博客
- for循环:蓝桥杯训练-序列求和(day7)-CSDN博客
四、python代码及逐行解析
n = int(input()) #输入字符串长度
pal = list(input()) #把输入的字符串转化成列表
count = flag = 0 #count计数,flag判断是否有一个单独出现的奇数字符了
m = n - 1
for i in range(m): #从头遍历到倒数第二个字符
for k in range(m, i - 1, -1): #从后往前直到i寻找到和pal[i]相同的pai[k]
if k == i: #没找到相同字符,说明有一个出现个数为奇数的字符
if n % 2 == 0 or flag == 1: #impossible两种情况:
print("impossible") #1.字符串个数为偶数,遍历到一个出现个数为奇数的字符;
exit() #2.字符串个数为奇数,在有一个奇数个字符上又遍历到出现个数为奇数的字符
flag = 1 #字符串个数为奇数,记录有一个单独出现的奇数字符
count += int(n / 2) - i #把出现奇数次的字符直接移到中间需要的步数
elif pal[k] == pal[i]:
for j in range(k, m): #出现相同字符,交换
pal[j], pal[j + 1] = pal[j + 1], pal[j]
count += 1 #计数器加1
m -= 1 #排好序不再比较
break
print(count)
运行结果:
5
mamad
3