
小N现在有一个字符串S。他把这这个字符串的所有子串都挑了出来。一个S的子串T是合法的,当且仅当T中包含了所有的小写字母。小N希望知道所有的合法的S的子串中,长度最短是多少
题目
- 原题地址:字符串
- 题目编号:NC18386
- 题目类型:尺取法
- 时间限制:C/C++ 1秒,其他语言2秒
- 空间限制:C/C++ 32768K,其他语言65536K
1.题目大意
- 字符串S,找出长度最短的合法子串的长度,一个S的子串T是合法的,当且仅当T中包含了所有的小写字母。
2.题目分析
- 尺取法,利用两个指针,右指针移右移到合法状态,左指针右移到不合法状态
- 反复移动,直至到达最大长度
3.题目代码
#include <bits/stdc++.h>
using namespace std;
int f[123]; // z的ASCII为122
int l, r;
int ans = 1e9 + 5;
int main() {
string str;
cin >> str;
int len = str.length();
int cnt = 0;
while(l<len)
{
while(r<len&&cnt<26)
{
f[str[r]]++;
if(f[str[r++]]==1)
cnt++;
}
if(cnt==26)
ans = min(ans, r-l);
if(f[str[l]]==1)
cnt--;
f[str[l++]]--;
}
cout << ans << endl;
}
- 参考题解
- 尺取法:
- 尺取法通常是指对数组保存一对下标(起点,终点),然后根据实际情况交替推进两个端点直到得出答案的方法,这种操作很像是尺取虫爬行的方式故得名。
![尺取虫]()