这题一看就可以用暴力,没什么好说的
优化一下,用双指针,用一个26个元素的数组统计各字母在子串中出现过的次数判断是否符合题意即可
#include <iostream> #include <string> using namespace std; //用于判断是否符合题意 bool isLegal(const int (&alphabet)[26]) { for (int i : alphabet) { if (i == 0)return false; } return true; } int main() { //26个元素表示对应字母在子串中出现的次数; int alphabet[26] = {0}; string S; cin >> S; int begin = 0, end = 0, length = 1, minLength = 0x3f3f3f3f; alphabet[S[0] - 'a']++; while (end < S.length()) { if (isLegal(alphabet)) { if (length < minLength)minLength = length; alphabet[S[begin] - 'a']--; begin++; length--; } else { end++; alphabet[S[end] - 'a']++; length++; } } cout << minLength << endl; }