尺取法感觉就是先找到一个区间然后,双指针移动!

//https://ac.nowcoder.com/acm/problem/18386
j 指针移动条件为 满足条件
#include<iostream>
#include<map>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
typedef pair<int,int> PII;
#define ll long long
#define IOS ios_base :: sync_with_stdio(false); cin.tie(nullptr);
#define fi first
#define se second
const int N = 1e6+9;
char s[N];
int cnt[30];
bool ok()
{
    for(int i=0; i<26; i++)
    {
        if(!cnt[i]) return false;
    }
    return true;
}
int main()
{
    scanf("%s",s+1);
    int len = strlen(s+1);
    int ans = 0x3f3f3f3f;
    for(int i=1,j=1; i<=len; i++)
    {
        cnt[s[i] - 'a']++;
        for(; j<=len && ok(); j++)
        {
            ans = min(ans,i - j + 1);
            cnt[s[j] - 'a']--;
        }
    }
    cout<<ans<<"\n";
    return 0;
}
///样例输入
///ykjygvedtysvyymzfizzwkjamefxjnrnphqwnfhrnbhwjhqcgqnplodeestu
///输出 49

POJ Problem: 3320
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#include<map>
using namespace std;
const int N = 2e5+9;
int a[N];
map<int,int> kind,now;
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1; i<=n; i++) scanf("%d",&a[i]),kind[a[i]]++;
    int x = kind.size();
    kind.clear();
    int pos = 0;
    for(int i=1; i<=n; i++)
    {
        kind[a[i]]++;
        now[a[i]]++;
        if(kind.size() == x)
        {
            pos = i;
            break;
        }
    }
    int l = 1,r = pos;
    int cnt = x;
    int ans = 1e9+7;
    for(;;)
    {
        if(r == n+1) break;
        //printf("l = %d r = %d cnt = %d\n",l,r,cnt);
        if(cnt >= x)
        {
            ans = min(ans,r - l + 1);
        }
        int y = now[a[l]];
        if(--y <= 0 && cnt <= x)
        {
            r++;
            if(now[a[r]]++ == 0) cnt++;
        }
        else
        {
            if(now[a[l]]-- == 1) cnt--;
            l++;
        }
    }
    printf("%d\n",ans);
    return 0;
}


POJ Problem: 3061	
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
const int N = 2e5+9;
int a[N];
int main()
{
    int _;
    scanf("%d",&_);
    while(_--)
    {
        int n,s;
        scanf("%d%d",&n,&s);
        vector<int> sum(n+10,0);
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&a[i]);
            sum[i] = sum[i-1] + a[i];
        }
        int ans = n;
        if(sum[n] < s) printf("0\n");
        else
        {
            int pos = 0;
            for(int i=1; i<=n; i++)
            {
                if(sum[i] >= s)
                {
                    pos = i;
                    break;
                }
            }
            int l = 1,r = pos;
            for(;;)
            {
                if(r == n+1) break;
                if(sum[r] - sum[l-1] >= s)
                {
                    ans = min(ans,r-l+1);
                    l++;
                }
                else
                {
                    r++;
                }
            }
            printf("%d\n",ans);
        }
    }
    return 0;
}