解题思路:本题中要求给定长度的字符串通过两两交换字符转换为回文字符串的最小步数,这一题中我们需要设置一个用于计算交换次数的变量count,一个判断是否有奇数项元素的标志位youji,以及一个调整每一次交换位置的变量end
从字符串的最左边开始遍历,然后从最右边往左查找有没有相同的元素,有的话就按照题目要求的交换方法将其两两交换至end下标处,(每次处理完更新end,第一个元素交换完成,就更新end为n-2,最开始end是最大下标n-1,对应着从左遍历的第一个元素的对称位置),如果出现找不到的情况,即为从右往左遍历完也没有找到跟当前元素一样的元素,则说明该元素为奇数项(有奇数个),这时需要判断字符串是否为偶数长度以及是否存在其他奇数项元素,如果这两个条件满足任意一个则说明字符串无法回文,因为字符串要是最终符合回文条件,长度为奇数时,只能有一个中间的奇数项,长度为偶数时,不能有奇数项。当判断出impossible条件后,我们就可以直接exit,终止整个程序,不再进行后续运行,防止输出额外内容。
注意事项:
每一次遍历完要记得再能找到对应项的情况下,把end-1,因为上一次的end状态已经替换好了对应的相同项,不需要再考虑,同时防止误判;
当出现找不到的情况记得把youji标志位置为1,这时非impossible的话可以直接加上该奇数项移动到中间的步数,不需要再调整字符中该项的位置,因为其他的排好后这一项自动就被挤到中间了,其他的也没位了,每一次都加上移动步数的话反而相当于多统计了好几次移动到中间的步数,因为你移动它到中间后再排剩下的会把中间位置打乱;
注意 if i==j,即判断impossible的判断要放在嵌套循环的最开始,不然的话当i等于j的时候m[i]肯定也是等于m[j]的,这样上面的if m[j]==m[i]运行完break了,就没法进行非回文情况的判断了
参考代码:
n=int(input())
m=list(input())
count=0
youji=0
end=n-1
for i in range(n//2+1):
for j in range(end,i-1,-1):
if i==j:
if n%2==0 or youji==1:
print("Impossible")
exit(0)
youji=1
count+=n//2-i
break
if m[j]==m[i]:
for h in range(j,end):
m[h],m[h+1]=m[h+1],m[h]
count+=1
end -= 1
break
print(count)
0.0分
2 人评分