有序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 
#include
#include
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>sList[i];
    }
    for (int i=0; i=0 ; j--) {
            if (s[j]=='0') {
                houCount0++;
            }
            hou[j]=houCount0;
        }
        hou[s.length()]=0;
        
        int min=hou[0];//从0开始
        for (int j=0; jtemp) {
                min=temp;
            }
        }
        
        cout<



你可能感兴趣的:(算法)