NC18386 字符串

题目

  • 原题地址:字符串
  • 题目编号: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;
}
  • 参考题解
  • 尺取法:
    • 尺取法通常是指对数组保存一对下标(起点,终点),然后根据实际情况交替推进两个端点直到得出答案的方法,这种操作很像是尺取虫爬行的方式故得名。
    • 尺取虫
posted @ 2022-07-04 21:56  仪战群儒  阅读(68)  评论(0)    收藏  举报