小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。 在冒泡排序中,每次只能交换相邻的两个元素。小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符, 则在所有可能的排序方案中,冒泡排序的总交换次数是最少的。
例如,对于字符串 lan 排序,只需要 1 次交换。对于字符串 qiao 排序, 总共需要 4 次交换。
小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要 100 次交 换,可是他忘了吧这个字符串记下来,现在找不到了。
请帮助小蓝找一个只包含小写英文字母且没有字母重复出现的字符串,对 该串的字符排序,正好需要 100 次交换。如果可能找到多个,请告诉小蓝最短的那个。如果最短的仍然有多个,请告诉小蓝字典序最小的那个。请注意字符串中不可以包含相同的字符。
第一步审题,第二步再审题,第三步再审题
注意题中两个特殊条件,限定了范围
1.只包含小写英文字母且没有字母重复出现 | 没有重复字母 |
---|---|
2.字典序最小 | 就是a<b,b<c ,相同的情况下,要前面的 |
分析:在冒泡排序中,肯定是英文小写字母全都倒叙排序次数最多,最坏情况
先看看英文次序:
sum=0
for i in range(26):
print(chr( ord('A') +sum ) ,end=" ")
sum=sum+1
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
假如是DCBA,那么交换结果是:
1.CDBA
2.CBDA
3.BCDA
4.BCAD
5.BACD
6.ABCD
为3+2+1+0=6
如果是:CBA,交换为:
1.BCA
2.BAC
3.ABC
为2+1+0=3
则全部倒叙的为((n-1)+1)(n-1)/2=n(n-1)/2
当n为15时,1514/2=(150+60)=210/2=105
n为14时,1414-13=183,183/2<100
则结果应该是:
sum=0
a=[]
for i in range(15):
a.append( chr( ord('a') +sum ) )
sum=sum+1
print( " ".join( "%s" %id for id in a[::-1]))
结果不是这个, o n m l k j i h g f e d c b a ,这个移动次数是105次,只需将a移动?次,
为什么不移动其他的呢?因为a在英文字母里面字典次序最小
建议手算,代码作为验证