问题描述
对于一个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字符串,你每次可以将一个0修改成1,或者将一个1修改成0。那么,你最少需要修改多少次才能把一个01串 S 变为有序01字符串(有序01字符串是指满足所有0在所有1之前的01串)呢?输入
第一行是一个整数 T,代表测试数据的组数。(1 ≤ T ≤ 10)以下T行每行包含一个01串 S 。(1 ≤ |S| ≤ 1000)
输出
对于每组测试数据输出最少需要修改的次数。样例输入
3000111
010001
100000
样例输出
01
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=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=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;
}