链接:https://ac.nowcoder.com/acm/problem/18386
来源:牛客网
来源:牛客网
题目描述
小N现在有一个字符串S。他把这这个字符串的所有子串都挑了出来。一个S的子串T是合法的,当且仅当T中包含了所有的小写字母。小N希望知道所有的合法的S的子串中,长度最短是多少。
尺取法其实和快慢指针是一个东西,本题使用左右快慢指针可解。顺便还得使用散列的方式来计算是否满足条件。
//尺取法其实和快慢指针是一个东西,本题使用左右快慢指针可解 #include <iostream> #include <cstdio> #include <string> #include <limits.h> using namespace std; int main() { int v[300] = {}; int num = 0; int yes_num = 26; string s; int l = 0, r = 0; int res = INT_MAX; cin>>s; while (l<s.size()) { //r向右找寻直到满足尺取的条件 while (r<s.size()&&num<yes_num) { v[s[r]] += 1; if (v[s[r]]==1) { num++; } r++; } if (num==yes_num&&r-l<res) { res = r-l; } l++; //左指针向右移动 if (v[s[l]]!=0) { v[s[l]]--; if (v[s[l]]==0) { num--; } } } cout<<res-1; return 0; }