一、题目
1、原题链接
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;
}