1.题目
2.思路分析
贪心算法
这道题可以用贪心算法,而这道题的关键在于局部和整体的定义。
我们可以把字符串从左到右进行局部分析。局部分析是指我们只分析我们前面输入的内容,遍历这个数后面的数我们暂且不考虑。
假设我们已经遍历到了Si这个数,而要使Si-1这个数被计算,我们就优先看Si,因为Si之后的数是对于Si-1这个数的选择是没有作用的。如果Si-1这个数已经被当做子串了,我们再看后面这个数。
而对于问号这个问题,还是一样的思路,先看Si-1是否被占用,再看Si+1
这道题算是较为简单的一道贪心算法
3.代码
#include<bits/stdc++.h>
#define deb(x) cout<< #x << "=" <<x<<'\n'
#define INF 0x3f3f3f
using namespace std;
void solve()
{
string s;
cin>>s;
vector<bool>st(s.size());
int ans=0;
for(int i=0;i<s.size();i++)
{
if(s[i]!='?')
{
if(i-1>=0 && s[i]==s[i-1]&&!st[i])
{
st[i]=st[i-1]=true;
ans++;
}
else if(i+1<s.size() && s[i+1]=s[i]&&!st[i])
{
st[i]=st[i+1]=true;
ans++;
}
}
else
{
if(st[i])
{
continue;
}
else if(i-1>=0 && !st[i-1])
{
st[i-1]=st[i]=true;
ans++;
}
else if(i+1<s.size()&&!st[i+1])
{
st[i]=st[i+1]=true;
ans++;
}
}
}
cout<<ans<<endl;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
solve();
}
四.编译时应注意
在把代码写到蓝桥杯官网的时候,编译器报错为:
这个表示s.size()(s是string类)是无符号数,而int i是整型,两者不能进行比较,所以说我们应该在s.size()前加入(int)。