1. 题目来源
链接:3624. 三值字符串
2. 题目解析
双指针入门题,思维难度不高。
双指针与二分都是寻求一种单调性,二分是数值随着下标单调。双指针是一个指针随着另一个指针单调。
我们要求一个区间,显然得枚举区间起点、终点。在此枚举终点,暴力方法来讲是枚举前面所有的起点,将会是 O ( n 2 ) O(n^2) O(n2) 的时间复杂度。**
双指针定义:i
区间终点,j
与 i
最近且无冗余元素的区间起点。能发现 j
指针是单调不减的,作为起点 j
,当 cnt[s[j]] > 1
说明 j
向后移位更好。
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)
#include <bits/stdc++.h>
using namespace std;
int cnt[3];
int main() {
int T;
scanf("%d", &T);
string s;
while (T -- ) {
memset(cnt, 0, sizeof cnt);
cin >> s;
int n = s.size();
int res = 1e9;
for (int i = 0, j = 0; i < n; i ++ ) {
cnt[s[i] - '1'] ++ ;
while (cnt[s[j] - '1'] > 1) cnt[s[j ++ ] - '1'] -- ;
if (cnt[0] && cnt[1] && cnt[2]) res = min(res, i - j + 1);
}
if (res == 1e9) res = 0;
printf("%d\n", res);
}
return 0;
}