标题题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。
在冒泡排序中,每次只能交换相邻的两个元素。
小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符, 则在所有可能的排序方案中,冒泡排序的总交换次数是最少的。
例如,对于字符串 lan 排序,只需要 1 次交换。对于字符串 qiao 排序,总共需要 4 次交换。
小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要 100 次交 换,可是他忘了吧这个字符串记下来,现在找不到了。
请帮助小蓝找一个只包含小写英文字母且没有字母重复出现的字符串,对 该串的字符排序,正好需要 100 次交换。如果可能找到多个,请告诉小蓝最短的那个。如果最短的仍然有多个,请告诉小蓝字典序最小的那个。
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
做题思路:
要求字典序最小,那么显然要取a~o这15个字典序最小的字母
逆向思考,目标字符串经过100次交换后,得到正序字符串abcdefghijklmno,而完全逆序的字符串onmlkjihgfedcba变成正序字符串需要105次交换,那么将完全逆序的字符串交换5次后,便能得到答案。
而要求字典序最小,那么将j交换5次提到字符串最前面,就得到了最小的情况
什么是循环字符串的最小表示法?
对于一个字符串S,求S的循环的同构字符串S中字典序最小的一个。如:S=bacd,则S’可以是acdb,cdba,dbac,其中最小表示的S是acdb。即,该字符串的循环同构字符串中字典序最小的一个是acdb。
具体代码如下:
import java.io.*;
import java.util.*;
public class text010 {
public static void main(String args[]) throws Exception {
Scanner cin = new Scanner(System.in);
String a = cin.next();
int[] d = new int[a.length()];
String[] k = { "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" };
for (int i = 0; i < a.length(); i++) {
int g = 0;
for (int n = 0; n < k.length; n++) {
if (a.substring(i, i + 1).equals(k[n])) {
g = n;
}
}
d[i] = g;
}
int h = 0;
for (int i = 0; i < d.length; i++) {
for (int m = i + 1; m < d.length; m++) {
if (d[i] > d[m]) {
int e = d[i];
d[i] = d[m];
d[m] = e;
h++;
}
}
}
System.out.println(h);
}
}