Kattis Problem-Lektira
题目类型:字符串、枚举
题意:
在一个字符串上任选两个位置进行切割将其分为 3 段,并将每一段进行反转,然后再按原来的顺序拼接起来。求通过该操作可以获得的字典序最小的字符串。
分析
因为题目的数据范围较小,所以可以暴力枚举所有切割点,然后选取字典序最小的那个。
代码
public static void solve() throws IOException {
char[] s = next().toCharArray();
char[] a = new char[51];
char[] b = new char[51];
char[] c = new char[51];
char[] ans = new char[s.length];
for (int i = 0, len = s.length; i < len; i++) ans[i] = 'z';
for (int i = 0, len = s.length; i < len - 2; i++) {
for (int j = i + 1; j < len - 1; j++) {
for (int k = 0; k <= i; k++) a[k] = s[k];
for (int k = 0; k < j - i; k++) b[k] = s[k + i + 1];
for (int k = 0; k < len - j - 1; k++) c[k] = s[k + j + 1];
char[] t = merge(a, i + 1, b, j - i, c, len - j - 1);
if (compareTo(ans, t, len)) ans = t;
}
}
for (int i = 0, len = s.length; i < len; i++) pw.print(ans[i]);
pw.println();
}
public static boolean compareTo(char[] a, char[] b, int len) {
for (int i = 0; i < len; i++) {
if (a[i] < b[i]) return false;
if (a[i] > b[i]) return true;
}
return false;
}
public static char[] merge(char[] a, int aLen, char[] b, int bLen, char[] c, int cLen) {
char[] re = new char[50];
reverse(a, aLen);
reverse(b, bLen);
reverse(c, cLen);
for (int i = 0, j = 0; j < aLen; i++, j++) re[i] = a[j];
for (int i = aLen, j = 0; j < bLen; i++, j++) re[i] = b[j];
for (int i = aLen + bLen, j = 0; j < cLen; i++, j++) re[i] = c[j];
return re;
}
public static void reverse(char[] a, int len) {
for (int i = 0, j = len - 1; i <= j; i++, j--) {
char c = a[i];
a[i] = a[j];
a[j] = c;
}
}