题意
给出一个串,求出里面最短的子串使得其中包含的字母种类最多而它的长度最短。
思路
维护一个队列,使得这个队列中的队头的字母在这个队列中不重复,找出一个时刻它的长度最短而所有字母都在其中,时间复杂度 O ( N ) O(N) O(N)。
代码
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
std::queue<int> q;
int N, g, ans, kind, now;
int s[52];
char c[500001];
int main() {
scanf("%d\n", &N);
scanf("%s", c + 1);
for (int i = 1; i <= N; i++) {
if (c[i] >= 'a' && c[i] <= 'z') g = c[i] - 'a';
else if (c[i] >= 'A' && c[i] <= 'Z') g = c[i] - 'A' + 26;
s[g]++;
if (s[g] == 1) kind++;
}
memset(s, 0, sizeof(s));
ans = 500001;
for (int i = 1; i <= N; i++) {
if (c[i] >= 'a' && c[i] <= 'z') g = c[i] - 'a';
else if (c[i] >= 'A' && c[i] <= 'Z') g = c[i] - 'A' + 26;
s[g]++;
if (s[g] == 1) now++;
q.push(g);
while (s[q.front()] >= 2) {
s[q.front()]--;
q.pop();
}
if (now == kind) ans = std::min(ans, int(q.size()));
}
printf("%d", ans);
}