第三题
给出一个只包含大写英文字母A,B,C的字符串,每次可以选择该字符串的一个前缀,然后将其反转,请问至少反转多少次,才能使字符串中较小字母都排在较大的字母的之前,即字母A都在字母B,C之前,字母B都在字母C之前。
输入描述:
第一行给定两个正整数N,Q,代表字符串的长度和字符串的个数
接下来Q行每行给出一个长度为N的字符串
2 ≤ N ≤ 13 , 1 ≤ Q ≤ 100000 2\leq N\leq 13, 1\leq Q\leq 1000002≤N≤13,1≤Q≤100000
输出描述:
对于每个字符串在一行中输出一个整数代表最小的反转次数
例一:
输入:
5 1
ABCBA
输出:
3
说明:
ABCBA -> BCBAA -> CBBAA -> AABBC
例二:
输入:
5 1
CCBAB
输出:
2
说明:
CCBAB -> BABCC -> ABBCC
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int Q = sc.nextInt();
List<String> list = new ArrayList<>();
for (int i = 0; i < Q; i++) {
list.add(sc.next());
}
for (int i = 0; i < Q; i++) {
revert(list.get(i));
}
}
// CCBAB ->BABCC ->ABBCC
public static void revert(String s) {
int ans = Math.min(minCnt(s.toCharArray(),'A')+1,minCnt(s.toCharArray(),'C'));
System.out.println(ans);
}
static int minCnt(char[] chars,char end){
//反转 CBA ABC
System.out.println("以"+end+"结尾的反转顺序:");
int j = chars.length - 1;
char c = end;
int count = 0;
while (j >0) {
while (chars[j] == c) {
j--;
if (j == 0) {
return count;
}
}
for (int i = 0; i <= j; i++) {
if (chars[i] == c) {
if (i != 0) {
reverse(chars, i+1);
count++;
System.out.println(chars);
}
reverse(chars, j+1);
count++;
System.out.println(chars);
break;
}
if (i == j) {
if (end == 'A') {
c++;
}else {
c--;
}
}
}
}
return count;
}
static char[] reverse(char[] a, int n) {
char t;
for (int i = 0; i < n / 2; i++) {
t = a[i];
a[i] = a[n - i - 1];
a[n - i - 1] = t;
}
return a;
}
}