去掉0 (每日一题)
原题链接: AcWing
题目描述:
给定一个字符串 s,其中的每个字符要么是 1,要么是 0。 我们希望字符串中的所有 1 能够形成一个连续的子串,例如,字符串 0、1、00111、01111100 均满足此条件,而字符串 0101、100001、11111111111101 均不满足此条件。 你可以从字符串中删除一些(也可以不删)0,使得字符串满足上述条件。 请问,你必须删除的最小 0 数量是多少。
输入格式
第一行包含整数 T,表示共有 T 组测试数据。 每组数据占一行,包含一个 01 字符串 s。
输出格式
每组数据输出一行结果,一个整数,表示必须删除的最小 0 数量。
数据范围
前 3 个测试点满足 1≤T≤10, 所有测试点满足 1≤T≤100,1≤|s|≤100。
输入样例:
3
010011
0
1111000
输出样例:
2
0
0
解题思路:
这道题咋一看像是那种求最长连续或不连续子串的类型的题,还以为可能会用到双指针算法,现在看来其实题目已经给了可以直接暴力求解的办法,既然说了可以不删除 0,那么实际上只要求出字符串中从左往右开始遇到第一个 1 之后到最后一个 1 之间的 0 的个数就行了,省略掉前面和末尾的 0,只用一个变量来对 1 之间的所有的 0 计数,最后得到的就是答案。
代码:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
string s;
cin>>s;
int n = 0,m = 0;
for(int i=0;s[i];++i)
{
if(s[i]=='0'&&m)
{
n++;
}
if(s[i]=='1')
{
m = 1;
}
}
for(int i=s.size()-1;s[i]=='0'&&n;--i)
{
n--;
}
cout<<n<<endl;
}
return 0;
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 一生雾梦!
评论
ValineDisqus