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

文章目录

  • 一、题目
    • 1、原题链接
    • 2、题目描述
  • 二、解题报告
    • 1、思路分析
    • 2、时间复杂度
    • 3、代码详解

一、题目

1、原题链接

4966. 填充

2、题目描述

【寒假每日一题·2024】AcWing 4966. 填充(补)_第1张图片

二、解题报告

1、思路分析

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

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

2、时间复杂度

时间复杂度为O(n)

3、代码详解

#include 
#include 
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;
}

你可能感兴趣的:(AcWing寒假每日一题,算法,数据结构,贪心算法,c++,c语言,java,python)