AcWing 4966.填充

本文讲述了作者如何通过贪心策略解决一个字符匹配问题,涉及对特殊字符?的处理和遍历过程中的决策逻辑。代码展示了如何在C++中实现这个思路。
摘要由CSDN通过智能技术生成

这道题运用的贪心算法。

这里作者并没有按照贪心做,导致在第一次的时候怎么也做不对。说实话,真不知道贪心这个算法真的正确不正确,很难判断,但这里就是有效,也并不清楚具体的原理,所以这里作者只好讲一下大概的思路了:

我一开始做的时候是直接把?全部换成了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;
}

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值