C++解题:寻找包含所有字符的最短区间 - ACJudge
{"title":"题目背景\n你知道做题网站的域名吗?\n\n题目描述\n给你一个字符串, 请求出最小的区间包换所有 acjudge 字母.\n\n数据格式\n输入格式\n给你一行一个字符串 \n\ts, 仅包含小写字母.\n\n输出格式\n输出一个整数, 表示包含所有的 acjudge 中的字母的最小区间的长度, 如果没有方案, 请输出 -1\n\n样例\n输入数据 1\nacjudge\n输出数据 1\n7\n输入数据 2\naaccjjuuddggee\n输出数据 2\n12\n输入数据 3\neeeeebgcudaecfjg\n输出数据 3\n8\n输入数据 4\nwajudge\n输出数据 4\n-1\n样例3解释\n第 \n10\n10 个符号到第 \n17\n17 个符号这段区间中, 所有的 acjudge 都包含, 且区间长度最短, 长度为 \n8\n8\n\n数据范围\n1\n<=\n∣\n�\n∣\n<\n=\n1\n0\n3\n1<=∣s∣<=10 \n3\n \n\n注意\n需要读写文件, 读入文件名为 acjudge.in, 输出文件名为 acjudge.out\n用C++做出这道题内容:cpp\n#include <iostream>\n#include <fstream>\n#include <vector>\n#include <unordered_map>\n\nusing namespace std;\n\nint main() {\n ifstream fin("acjudge.in");\n ofstream fout("acjudge.out");\n \n string s;\n fin >> s;\n \n unordered_map<char, int> count; // 记录每个字母出现的次数\n int numDistinct = 0; // 记录有多少个不同的字母\n for (char c : s) {\n if (count[c] == 0) {\n numDistinct++;\n }\n count[c]++;\n }\n \n int left = 0, right = 0; // 区间的左右边界\n int minLen = INT_MAX; // 最小区间的长度\n int numCovered = 0; // 记录当前区间已经包含的字母个数\n unordered_map<char, int> currCount; // 记录当前区间内每个字母出现的次数\n \n while (right < s.length()) {\n if (currCount[s[right]] == 0) {\n numCovered++;\n }\n currCount[s[right]]++;\n right++;\n \n while (numCovered == numDistinct) {\n if (right - left < minLen) {\n minLen = right - left;\n }\n \n currCount[s[left]]--;\n if (currCount[s[left]] == 0) {\n numCovered--;\n }\n left++;\n }\n }\n \n if (minLen == INT_MAX) {\n fout << -1 << endl;\n } else {\n fout << minLen << endl;\n }\n \n fin.close();\n fout.close();\n \n return 0;\n}\n
原文地址: https://www.cveoy.top/t/topic/qbuz 著作权归作者所有。请勿转载和采集!