赛氪OJ-专注于算法竞赛的在线评测系统 (saikr.com)
#include<bits/stdc++.h>
using namespace std;
//13
//there is a quick brown fox jumping over the lazy dog and cat
int main() {
int n;
cin >> n;
string s[100000];
int a[26] = {0}; // 统计字母a~z出现的个数
for (int i = 0; i < n; i++) {
cin >> s[i];
}
int num = 0; // 记录当前窗口中不同字母的数量
int ans = INT_MAX; // 存储最小长度的答案
int res = 0; // 当前窗口的长度
int l = 0, r = 0; // 滑动窗口的左右端点
while (r <= n) { // l一定小于r,设r就行了
// 不满26个字母就一直右移右端点
if (num < 26) {
for (int i = 0; i < s[r].length(); i++) {
a[s[r][i]-97]++;
if (a[s[r][i]-97] == 1) {
num++; // 出现了一个新字母就计数一下
}
}
res += s[r].length();
r++;
} else { // 当前区间够26个字母了
ans = min(ans, res); // 更新最小长度
// 移动左端点
for (int i = 0; i < s[l].length(); i++) {
a[s[l][i]-97]--;
if (a[s[l][i]-97] == 0) {
num--; // 一个字母已经被删没了
}
}
res -= s[l].length(); // 更新当前窗口的长度
l++; // 左端点++
}
}
cout << ans << endl; // 输出最小长度的答案
return 0;
}