算法题目0227-递增字符串
递增字符串
题目描述
定义字符串完全由 ‘A’ 和 ‘B’组成,当然也可以全是’A’或全是’B’。如果字符串从前往后都是以字典序排列的,那么我们称之为严格递增字符串。 给出一个字符串s,允许修改字符串中的任意字符,即可以将任何的’A’修改成’B’,也可以将任何的’B’修改成’A’,求可以使s满足严格递增的最小修改次数。0<s的长度<100000。
输入描述
输入一个字符串: “AABBA”
输出描述
输出:1 修改最后一位得到AABBB。
示例一
输入
AABBA
输出
1
参考解题 Java
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
*
* @Author: Amos
* @E-mail: amos@amoscloud.com
* @Date: 2023/2/15
* @Time: 11:24
* @Description:
*/
public class Main0227 {
public static void main(String[] args) {
try (Scanner scanner = new Scanner(System.in)) {
String line = scanner.next();
System.out.println(solution(line));
}
}
public static int solution(String str) {
int n = str.length();
int A = str.replaceAll("B", "").length();
int dp = 0;
int ans = A;
for (int i = 0; i < n; i++) {
if (str.charAt(i) == A) dp += 1;
ans = Math.min(ans, check(i, dp, A - dp));
}
return ans;
}
/**
* brand_LM_A : 当前位置左边A的个数(包含当前位置)
* brand_R_A : 当前位置右边A的个数
* brandIdx + 1 : 当前元素位置
* brandIdx + 1 - brand_LM_A : 当前元素左边有几个B
* 这个函数是计算当前位置 左边B的个数 + 右边A的个数 是想将左边B变为A,右边A变为B
* 索引为brandIdx位置的元素,转为有序需要修改多少个字符
*/
public static int check(int brandIdx, int brand_LM_A, int brand_R_A) {
return brandIdx + 1 - brand_LM_A + brand_R_A;
}
}
下一篇:
JavaScript面试题(七)
