{ "title": "题目背景\n你知道做题网站的域名吗?\n\n题目描述\n给你一个字符串, 请求出最小的区间包换所有 acjudge 字母.\n\n数据格式\n输入格式\n给你一行一个字符串 \n\ns, 仅包含小写字母.\n\n输出格式\n输出一个整数, 表示包含所有的 acjudge 中的字母的最小区间的长度, 如果没有方案, 请输出 -1\n\n样例\n输入数据 1\nacjudge\n输出数据 1\n7\n输入数据 2\naaccjjuuddggee\n输出数据 2\n12\n输入数据 3\neeeeeedbgcudaecfjg\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<\n=\n1\n0\n3\n1<=∣s∣<=10 \n3\n \n\n注意\n需要读写文件, 读入文件名为 acjudge.in, 输出文件名为 acjudge.out\n用freopen格式与简单语法做出这道题(附C++代码)内容:cpp\n#include <iostream>\n#include <fstream>\n#include <vector>\n#include <unordered_set>\nusing namespace std;\n\nint main() {\n // 读入文件\n freopen("acjudge.in", "r", stdin);\n freopen("acjudge.out", "w", stdout);\n\n string s;\n cin >> s;\n\n // 记录acjudge字母的索引位置\n vector<int> indices[7];\n for (int i = 0; i < s.length(); i++) {\n if (s[i] == 'a') indices[0].push_back(i);\n else if (s[i] == 'c') indices[1].push_back(i);\n else if (s[i] == 'j') indices[2].push_back(i);\n else if (s[i] == 'u') indices[3].push_back(i);\n else if (s[i] == 'd') indices[4].push_back(i);\n else if (s[i] == 'g') indices[5].push_back(i);\n else if (s[i] == 'e') indices[6].push_back(i);\n }\n\n // 初始化最小区间长度为字符串长度\n int minRange = s.length();\n\n // 遍历字符串,找到能包含所有acjudge字母的最小区间\n for (int i = 0; i < s.length(); i++) {\n // 使用unordered_set来记录已经出现过的字母\n unordered_set<char> letters;\n // 初始化当前区间的右端点为i\n int right = i;\n // 遍历acjudge字母的索引位置,找到能够包含所有字母的最小右端点\n for (int j = 0; j < 7; j++) {\n int k = 0;\n while (k < indices[j].size() && indices[j][k] <= right) {\n letters.insert('a' + j);\n k++;\n }\n if (k == indices[j].size()) {\n right = s.length() - 1;\n break;\n }\n right = max(right, indices[j][k]);\n }\n // 如果能够包含所有字母,则更新最小区间长度\n if (letters.size() == 7) {\n minRange = min(minRange, right - i + 1);\n }\n }\n\n // 输出结果\n if (minRange == s.length()) {\n cout << -1 << endl;\n } else {\n cout << minRange << endl;\n }\n\n return 0;\n}\n\n使用freopen函数可以将标准输入输出重定向到文件中,这样就可以读写文件了。首先使用freopen("acjudge.in", "r", stdin)将标准输入重定向到名为"acjudge.in"的文件,再使用freopen("acjudge.out", "w", stdout)将标准输出重定向到名为"acjudge.out"的文件。\n\n然后,我们用一个数组indices来记录每个字母的索引位置。遍历字符串s,将每个字母的索引位置加入到对应的数组中。\n\n接下来,我们初始化最小区间长度为字符串长度。然后遍历字符串s,以每个位置为起点,找到能够包含所有acjudge字母的最小右端点。我们使用unordered_set来记录已经出现过的字母,初始化当前区间的右端点为当前位置i。然后遍历acjudge字母的索引位置,找到能够包含所有字母的最小右端点。如果能够包含所有字母,则更新最小区间长度。最后输出结果。如果最小区间长度仍然是字符串长度,则输出-1,表示没有方案。\n\n这样就可以通过文件读写来解决这道题目了。

C++ 解题:最短区间包含所有字母 (acjudge) - 附带代码和文件读写

原文地址: https://www.cveoy.top/t/topic/qbuF 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录