1<=n<=1e6
思路:因为题目要求字串不重叠,所以当我们遍历到某一个字符时可以将它先与前面的比较,如果前面的字符没有配对且与它相等,那么匹配,否则就继续向下遍历,如果遍历到?,其实就是少了判断相等的步骤。
每次只看前面的,因为是连续且不重叠子串,所以如果前面的字符与 该字符不匹配,那么它一定不能与后面的字符匹配。而且这样匹配也不会影响后面字符的匹配。
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
string s;
cin>>s;
int n=s.size(),ans=0;
vector<int> v(n);
for(int i=0;i<n;i++)
{
if(i==0) continue;
if(i>0)
{
if(!v[i-1])
{
if(s[i]==s[i-1]||s[i]=='?'||s[i-1]=='?')
{
v[i]=1;
v[i-1]=1;
ans++;
}
}
}
}
cout<<ans<<endl;
return 0;
}