版权声明:转就转吧~~记得声明噢~~ 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;
}