一.题目描述
小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。在冒泡排序中,每次只能交换相邻的两个元素。
小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符,则在所有可能的排序方案中,冒泡排序的总交换次数是最少的。
例如,对于字符串 lan 排序,只需要 1 次交换。对于字符串 qiao 排序,总共需要 4 次交换。
小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要 100 次交换,可是他忘了吧这个字符串记下来,现在找不到了。
请帮助小蓝找一个只包含小写英文字母且没有字母重复出现的字符串,对该串的字符排序,正好需要 100 次交换。如果可能找到多个,请告诉小蓝最短的那个。如果最短的仍然有多个,请告诉小蓝字典序最小的那个。请注意字符串中不可以包含相同的字符。
二.思路分析
(1)冒泡排序的知识点:
一个长度为n的字符串,如果进行冒泡排序,假设他每次比较都进行了交换,那么它最多交换 (n-1)+(n-2)+…+1 = n*(n-1)/2 (进行n-1趟操作,第一趟操作交换n-1次,之后每趟交换的次数依次递减)。
(2)题目要求恰好100次交换,先算出离100次最近的次数,再进行处理。
在n*(n-1)/2>=100的前提下,n的最小值是15。也就是说,最后结果的字符串的长度至少15(低于15,它根本连交换100次的要求都达不到)。
(3)字典序比较字符串大小的知识点:
字典序是指从前到后比较两个字符串的大小的方法。首先比较第一个字符,如果不同则第一个字符较小的字符串更小,如果相同则继续比较第2个字符…如此继续,来比较整个字符串的大小。(因此,前15个英语字母即为最小的字典序)
目前可得知冒泡排序结束后的字符串为:abcdefghijklmno
冒牌排序前的字符串为:onmlkjihgfedcba
(4)减少逆序字符串的五次比较,使得比较次数刚好为100次
只需要把逆序字符串的第六位提前至第一位。在这种情况下,j减少了五次与o,m,n,l,k的比较次数。
最后的结果为::jonmlkihgfedcba
(5)图解