这道题运用的贪心算法。
这里作者并没有按照贪心做,导致在第一次的时候怎么也做不对。说实话,真不知道贪心这个算法真的正确不正确,很难判断,但这里就是有效,也并不清楚具体的原理,所以这里作者只好讲一下大概的思路了:
我一开始做的时候是直接把?全部换成了1或者0。但是后来发现,这个?不一定全是1或者0。所以我的思路有所判断失误了。
正确的思路是这样的:我们从左向右进行遍历,如果:
1.它与下一位字符是相同的,那理所当然就是符合题意的;
2.如果说它当前就是‘?’那么它可以替代成1或者0,也就是说它可以和下一位字符直接组合成00或者11的字符,个数也可以+1;
3。如果说它的下一位字符是‘?’,那么当前字符和下一位字符也可以组成00或者11的字符,因为‘?’既可以是1也可以是0,这就是贪心的思想。
另外,在我们判断这一对字符是符合题意的,我们就直接跳过遍历下一个字符,这里你可以用一个数组充当状态,也可以直接i++进行跳过。
上代码:
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>
#include<sstream>
#include<map>
#include<limits.h>
#include<set>
#define MAX 1000005
#define _for(i,a,b) for(int i=a;i<(b);i++)
#define ALL(x) x.begin(),x.end()
using namespace std;
typedef long long LL;
int n, m, counts, num;
char s[MAX];
char buf[MAX];
int st[MAX];
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> s;
n = strlen(s);
if(n==1||n==0)
cout<<0;
else{
for(int i=0;i<n;i++){
if(s[i]==s[i+1]||s[i]=='?'||s[i+1]=='?')
{
counts++;
i++;
}
}
cout<<counts<<endl;
}
return 0;
}