【寒假每日一题·2024】AcWing 4966. 填充(补)

一、题目

1、原题链接

4966. 填充

2、题目描述

在这里插入图片描述

二、解题报告

1、思路分析

思路参考y总:y总讲解视频

(1)我们可以将所有方案首先分为两类:第一类为第一个元素和第二元素相配对的方案;第二类为第一个元素和第二个元素不配对的方案。而在第二类方案中因为第一个元素和第二个元素不配对,所以下一组需要考虑的是第二个元素和第三个元素是否配对,也有两种情况:第一种是第二个和第三个元素配对;第二种是第二个和第三个元素不配对由于第一种情况的结果可以认为是与第一类方案的结果效果相同;而第二种情况时导致第一个元素和第二个元素都不配对,就相较第一类方案不优。所以我们可以得知:第一类方案中一定存在最优解。之后的元素配对情况同理。(按笔者理解叙述,如不恰当或有错误望谅解,详见上方y总讲解视频)
(2)我们就可以得出:在每次枚举的两元素在可配对的情况下,使其配对的方案是最优的
(3)于是,我们可以依次从前往后枚举,当遇到可以配对(配对的情况:两元素相等、其中一个元素为?、两元素均为?)的元素,使其配对即可;当遇到无法配对的元素时,直接跳过该元素,继续枚举即可,最终统计到的可以配对的个数即为答案。

2、时间复杂度

时间复杂度为O(n)

3、代码详解

#include <iostream>
#include <string>
using namespace std;
int ans;
string s;
int main() {
    cin >> s;
    for (int i = 0; i + 1 < s.size(); i++) {
        //若当前i与i+1元素匹配,则ans++,同时由于i+1已经匹配,下次i从i+2开始
        if (s[i] == s[i + 1] || s[i] == '?' || s[i + 1] == '?'){
            ans++;
            i++;
        }
    }
    cout << ans; 
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马看到什么是人决定的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值