华为OD题目:递增字符串

华为OD题目:递增字符串

时间限制: 1s 空间限制: 256MB 限定语言: 不限
题目描述:
定义字符串完全由“A’和B"组成,当然也可以全是"A"或全是"B。如果字符串从前往后都是以字典序排列的,那么我们称之为严格递增字符串。
给出一个字符串5,允许修改字符串中的任意字符,即可以将任何的"A"修改成"B,也可以将任何的"B"修改成”A,求可以使s满足严格递增的最小修改次数。0<s的长度<100000.

输入描述:
输入一个宁符串:“AABBA”
输出描述:
输出: 1
修改最后一位得到AABBB.

示例1
输入:AABBA
输出:

解题思路:

  • 动态规划 用所有情况全部列出来,
  • 参考题解
  • 方法一:动态规划 (然后将空间压缩一下)
  • 根据题意可知,字符有0和1两种状态,所以我们维护一个二维的dp数组来记录每个字符的状况。
  • dp[i][0]表示第i个字符是0的变换次数,dp[i][1]表示第i个字符是1的变换次数。
  • 根据单调性:
  • 若s[i-1] == ‘0’,s[i]是0或者1都可以保持单调性。
  • 若s[i-1] == ‘1’,s[i]则必须为1才可以保持单调性(必须满足i-1是1)。
  • 所以dp[i][0] = dp[i-1][0] + (s[i] == ‘1’ ? 1 : 0);(自己是0,则前边都是0)
  • dp[i][1] = Math.min(dp[i-1][0],dp[i-1][1]) + (s[i] == ‘0’ ? 1 : 0);(自己是1,前边0或者1都可以)
  • 最后result = Math.min(dp[i][0],dp[i][1])
  • //curDp0 表示变换后,当前值是0的 变换次数
  • curDp0 = preDp0 + (s[i] == ‘1’ ? 1 : 0)
  • curDp1 = max(preDp0,preDp1) + (s[i] == ‘0’ ? 1 : 0)
  • 作者:capital-worker
  • 链接:https://leetcode.cn/problems/flip-string-to-monotone-increasing/solution/jiang-zi-fu-chuan-fan-zhuan-dao-dan-diao-r91b/
  • 来源:力扣(LeetCode)
  • 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    */
public class My {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();

        int incr = getMinVal(line);
        System.out.println(incr);


    }

    public static int getMinVal(String s) {
        char[] chars = s.toCharArray();

        //前一个字符是0
        int preDpA = 0;
        //前一个字符是1
        int preDpB = 0;
        for (int i = 0; i < chars.length; i++) {
            char currChar = chars[i];
//            System.out.print(" cur char=" + currChar);
            //现将当前dp设置为前面一位dp,后面根据情况看是否要翻转
            int curDpA = preDpA;
            int curDpB = Math.min(preDpA, preDpB);
            //如果当前char为B,那么对于定义curDpA的值要翻转一次,因此+1
            if (currChar == 'B') {
                curDpA++;
            }else {
                //如果当前char为A,那么对于定义curDpB的值要翻转一次,因此+1
                curDpB++;
            }
            //刷新值
            preDpA = curDpA;
            preDpB = curDpB;

//            System.out.print(" dp0=" + curDpA);
//            System.out.print(" dp1=" + curDpB);
//            System.out.println();
        }
        int min = Math.min(preDpA, preDpB);
        return min;
//        System.out.println(min);
    }


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值