Wannafly挑战赛23A

版权声明:转就转吧~~记得声明噢~~ https://blog.csdn.net/Soul_97/article/details/82316909

尺取法

设置双指针 l r, r先向右移动,如果碰到某个字母第一次出现,总的字母个数就加1 一个数组vis记录 某个字符出现的次数

r 向右移动完之后  移动l   如果l这个位置的字母出现的次数大于1  说明此时 l,r区间内这个字母出现过了  所以 l向右移动来减小区间

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int N = 1e3 + 5;
const int mod = 1e9 + 7;

int vis[27];
int main()
{
    string s;
    cin >> s;

    int ans = INF, l = 0, r = 0, sum = 0;

    while(r < s.size())
    {
        if(!vis[s[r]-'a'])
            sum ++;

        vis[s[r]-'a'] ++;

        while(vis[s[l]-'a'] > 1)
        {
            vis[s[l]-'a'] --;
            l ++;
        }
        if(sum == 26)
            ans = min(ans, r - l + 1);

        r ++;
    }

    cout << ans << '\n';
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Soul_97/article/details/82316909