【华为OD机试】递增字符串
递增字符串
问题描述
定义字符串完全由 ‘A’ 和 ‘B’组成,当然也可以全是’A’或全是’B’。如果字符串从前往后都是以字典序排列的,那么我们称之为严格递增字符串。
给出一个字符串s,允许修改字符串中的任意字符,即可以将任何的’A’修改成’B’,也可以将任何的’B’修改成’A’,
求可以使s满足严格递增的最小修改次数。
0 < s的长度 < 100000。
输入描述
输入一个字符串: “AABBA”
输出描述
输出:1
示例
示例1
输入
AABBA
输出
1
示例1
输入
AABAABBBA
输出
2
解题思路
- 获取字符B首次出现索引位置,若不存在,则直接返回;
- 获取字符A首次出现索引位置,若不存在,则直接返回;
- 问题转化为两索引对应的字符串片段形成严格递增字符串问题;
- 字符最小数为最大修改次数;
- 定义一个指针,左边作为全为A,右边全为B,统计需要修改的次数,与最大修改次数比较获取最小值;
代码示例
/** * 获取成为严格递增字符串的最小修改次数 * @param str 由 ‘A’ 和 ‘B’组成的字符串 * @return 最小修改次数 */ public int minModTimes(String str) { // 起始B字符位置 int from = str.indexOf(B); if(from < 0) { return 0; } // 尾部A字符位置 int to = str.lastIndexOf(A); if(from > to) { return 0; } // 右边A数量 int r = 1; for (int i = from + 1; i < to; i++) { if(str.charAt(i) == A) { r++; } } // 左边B数量、最小修改数 int l = 0, min = r; for(int i = from; i <= to; i++) { // 从索引位置开始将字符转成 A if(str.charAt(i) == B) { l++; } else { r--; min = Math.min(min, l + r); } } return min; }