有一个长度为 n 的 0101 串,其中有一些位置标记为 ?,这些位置上可以任意填充 0 或者 1,请问如何填充这些位置使得这个 0101 串中出现互不重叠的 00 和 11 子串最多,输出子串个数。
输入格式
输入一行包含一个字符串。
输出格式
输出一行包含一个整数表示答案。
数据范围
对于所有评测用例,1≤n≤10^6。
输入样例:
1110?0
输出样例:
2
样例解释
如果在问号处填 0,则最多出现一个 00 和一个 11:111000。
思路:经典的贪心问题,想清楚一个问题就行,代码很简单
即再碰到有二选一的情况下s[i]和s[i+1]配对有最优解,s[i+1]和s[i+2]不一定有、
比如:1 1 1 0中 选前两个一是最优解,选中间两个也是,但是先选总没错。
代码:
#include <iostream> #include <cstring> #include <algorithm> using namespace std; int main(){ string s; cin>>s; int res=0; for(int i=0;i+1<s.size();i++){ char a=s[i],b=s[i+1]; if(a==b||a=='?'||b=='?') { res++; i++; } } cout<<res; }