你可能见过下面这个句子: “The quick brown fox jumps over the lazy dog.” 短短的?句话就包含了所有 26 个英?字母!因此这句话?泛地?于字体效果的展?。更短的还有: “The five boxing wizards jump quickly.” 所以你很好奇:还有没有更多这样包含所有 26 个英?字母的句??于是你?爬?在互联?上爬取了许多英??本,并且提取出了其中的单词。你现在希望从?个很长的单词序列中找出?段连续出现的单词,它满?: 所有 26 个英?字母都?少出现?次; 长度尽可能短,即包含的字母总数尽可能少。 输出你找到的单词序列中的字母总数。c++代码
时间: 2023-06-30 20:27:21 浏览: 434
以下是基于滑动窗口的 C++ 代码实现。时间复杂度为 O(n)。其中,words 为输入的单词序列,len 为单词序列的长度,cnt 为记录每个单词中出现的英文字母次数的数组。
```c++
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
int main() {
string words[] = {"the", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"};
int len = 9;
int cnt[26] = {0};
int l = 0, r = 0;
int res = INT_MAX;
int sum = 0;
while (r < len) {
for (int i = 0; i < words[r].size(); i++) {
cnt[words[r][i] - 'a']++;
if (cnt[words[r][i] - 'a'] == 1) {
sum++;
}
}
while (l <= r && sum == 26) {
res = min(res, r - l + 1);
for (int i = 0; i < words[l].size(); i++) {
cnt[words[l][i] - 'a']--;
if (cnt[words[l][i] - 'a'] == 0) {
sum--;
}
}
l++;
}
r++;
}
cout << res << endl;
return 0;
}
```
阅读全文