题目 1467: 蓝桥杯基础练习VIP-完美的代价
时间限制: 1Sec 内存限制: 128MB 提交: 3182 解决: 930
题目描述
回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
交换的定义是:交换两个相邻的字符
例如mamad
第一次交换 ad : mamda
第二次交换 md : madma
第三次交换 ma : madam (回文!完美!)
输入
第一行是一个整数N,表示接下来的字符串的长度(N < = 8000)
第二行是一个字符串,长度为N.只包含小写字母
输出
如果可能,输出最少的交换次数。
否则输出Impossible
样例输入复制
5 mamad
样例输出复制
3
有两个版本
版本一:注释主要在版本2,修改过的部分在版本1注释
通过率91,还是这个不知道为啥过不了,如果有人知道怎么改或者为什么这个会错可以告诉我一下嘛
这个是我写那个超时版本注释的时候突然想到的,受那个count启发,rindex用不了说不定rfind能用呢。字符串和列表的这些函数还是有很多不一样啊。
def pd(n,st):
global c,quan
jihe=set(st)
for a in jihe:
b=st.count(a)
quan+=b
if(b%2!=0):
c+=1
return c
def jh(n,st):
global c,change
pd(n,st)
if(c>1):
print("Impossible ")
else:
for i in range(n//2):
zfc=''.join(st)
if(zfc.count(st[i],i,n-i)==1 and n%2!=0):
mid=st[i]
st[i]=st[i+1]
st[i+1]=mid
change+=1
while(st[-(i+1)]!=st[i]):
#reindex用不了所以就转成字符串用refind
k=zfc.rfind(st[i],i+1,n-1-i)#这里减少了一个循环,所以会快一些
for j in range(k,n-i-1):
mid=st[j]
st[j]=st[j+1]
st[j+1]=mid
change+=1
print(change)
quan=0
c=0
change=0
n=int(input())
st=list(input())
jh(n,st)
版本二:
这个挺有问题的通过率55%
def pd(n,st):
global c,quan
jihe=set(st)#把列表转化成集合,利用集合中元素不重复这个特性
for a in jihe:
b=st.count(a)
quan+=b
if(b%2!=0):
c+=1#记录出现单数次的字母数
return c
def jh(n,st):
global c,change#定义全局变量
pd(n,st)
if(c>1):
print("Impossible ")
else:
for i in range(n//2):
zfc=''.join(st)#把列表转化成字符串
if(zfc.count(st[i],i,n-i)==1):
#这里如果直接使用if(st.count(st[i])==1):的话,用aaabb测试过不了
#列表的count不能指定起终点
mid=st[i]
st[i]=st[i+1]#如果这个字母出现一次,我们应该把它往中间放
st[i+1]=mid
change+=1
#这里我每次把这个字母往后移一个,然后他原来那个位置又有其他的字母可以继续执行下面那段代码
while(st[-(i+1)]!=st[i]):
for k in range(n-1-i,i,-1):#从后往前找和第i个字母相同的字母
if(st[i]==st[k]):
for j in range(k,n-i-1):
mid=st[j]
st[j]=st[j+1]
st[j+1]=mid
change+=1
break
#k=st.rindex(st[i],i+1,n-i)这里本来想用这个获取k,
#但是一直报错'list' object has no attribute 'rindex'
print(change)
quan=0
c=0
change=0
n=int(input())
st=list(input())
jh(n,st)
这个方法很超时,大一点的数据都超时
还有一个数据不知道为啥输出错误,在其他地方运行是对的啊