有序01字符串(hihocoder164周)

问题描述

对于一个01字符串,你每次可以将一个0修改成1,或者将一个1修改成0。那么,你最少需要修改多少次才能把一个01串 S 变为有序01字符串(有序01字符串是指满足所有0在所有1之前的01串)呢?

输入

第一行是一个整数 T,代表测试数据的组数。(1 ≤ T ≤ 10)
以下T行每行包含一个01串 S 。(1 ≤ |S| ≤ 1000)

输出

对于每组测试数据输出最少需要修改的次数。

样例输入

3
000111
010001
100000 

样例输出

0
1
1

解题思路

假设01串S长度为len,最后变换完成的01串前的k(0-len)个字符为0,后len-k个为1,然后跟原始状态对比,从而确认一共变换了多少次。

但是如果直接进行对比则时间复杂度为O(n2),所以需要对其进行预处理,只需要计算出各个前缀字符串中的1的个数和后缀字符串中0的个数进行循环即可,时间负责度为O(n)。
例如
1001101
k=0时,前缀字符串为空,其中有0个1;后缀字符串为1001101,其中有3个0,次数为0+3=3
k=1时,前缀字符串为1,其中有1个1;后缀字符串为001101,其中有3个0,次数为1+3=4
k=2时,前缀字符串为10,其中有1个1;后缀字符串为01101,其中有2个0,次数为1+2=3
k=3时,前缀字符串为100,其中有1个1;后缀字符串为 1101,其中有1个0,次数为1+1=2
k=4时,前缀字符串为1001,其中有2个1;后缀字符串为101,其中有1个0,次数为2+1=3
k=5时,前缀字符串为10011,其中有3个1;后缀字符串为01,其中有1个0,次数为3+1=4
k=6时,前缀字符串为100110,其中有3个1;后缀字符串为 1,其中有0个0,次数为3+0=3
k=7时,前缀字符串为1001101,其中有4个1;后缀字符串为空,其中有0个0,次数为4+0=4

代码:
//
//  main.cpp
//  hiho164
//
//  Created by 小哲 on 17/8/21.
//  Copyright © 2017年 小哲. All rights reserved.
//

#include <iostream>
#include<string.h>
#include<string>
using namespace std;

int main(int argc, const char * argv[]) {
    
    int n;
    cin>>n;
    int qian[1001];
    int hou[1001];
    string s;
    string sList[10];
    for (int i=0; i<n; i++) {
        cin>>sList[i];
    }
    for (int i=0; i<n; i++) {
        s=sList[i];
        int qianCount1=0;
        for (int j=0; j<s.length(); j++) {
            if (s[j]=='1') {
                qianCount1++;
            }
            qian[j]=qianCount1;
        }
        
        int houCount0=0;
        for (int j=s.length()-1;j>=0 ; j--) {
            if (s[j]=='0') {
                houCount0++;
            }
            hou[j]=houCount0;
        }
        hou[s.length()]=0;
        
        int min=hou[0];//从0开始
        for (int j=0; j<s.length(); j++) {
            int temp=qian[j]+hou[j+1];
            if (min>temp) {
                min=temp;
            }
        }
        
        cout<<min<<endl;
    }
    
    return 0;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值