1 条题解
-
0
知识点:贪心、思维、构造
延续题干定义,记选中的子串为 ,那么 的最优构造方案为以下两个中的其中一个:
-
第一段仅包含一个字符,即 的第一个字母,需要去位置 前寻找;第二段包含 的剩余部分,可以共用这部分;
-
第二段仅包含一个字符,即 的最后一个字母,需要去位置 后寻找;第一段包含 的剩余部分,可以共用这部分;
这样的选择方式最大程度的重复利用了字符,为最佳贪心策略。所以,我们只需要判定是否存在相同的字符,如果是,则更新答案。具体到代码层面上,对于每一种字符,找到其出现的全部位置,依次枚举检查更新答案。虽然依旧存在非常多优化,但是这样朴素的贪心策略已经可以通过本题,且没有复杂度上的本质差异,所以这里不再赘述其他做法。
需要注意的是,由于不允许选取空串,所以答案不存在的情况。
#include <bits/stdc++.h> using namespace std; signed main() { int n; string s; cin >> n >> s; s = "#" + s; int ans = 0; for (int ch = 0; ch < 26; ch++) { int pre = 0, net = 0; for (int i = 1; i <= n; i++) { if (s[i] - 'a' != ch) continue; if (pre != 0) { ans = max(ans, n - i + 1); } pre = i; } for (int i = n; i >= 1; i--) { if (s[i] - 'a' != ch) continue; if (net != 0) { ans = max(ans, i); } net = i; } } cout << (ans == 1 ? 0 : ans) << "\n"; } -
- 1
信息
- ID
- 164
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 31
- 已通过
- 7
- 上传者