链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
小N现在有一个字符串S。他把这这个字符串的所有子串都挑了出来。一个S的子串T是合法的,当且仅当T中包含了所有的小写字母。小N希望知道所有的合法的S的子串中,长度最短是多少。
输入描述:
一行一个字符串S。只包含小写字母。S的长度不超过106.
输出描述:
一行一个数字,代表最短长度。数据保证存在一个合法的S的子串。
#include<bits/stdc++.h>
using namespace std;
int book[26]={0};
int check()
{
for(int i=0;i<26;i++)
{
if(!book[i])
return 0;
}
return 1;
}
int main()
{
string s;
cin>>s;
int n=s.size();
int ans=1e6+10;
for(int l=0,r=0;r<n;r++)
{
book[s[r]-'a']++;
while(check()){
ans=min(ans,r-l+1);
book[s[l++]-'a']--;
}
}
cout<<ans;
return 0;
}
涉及到字符串的子串长度问题,可以联想到尺取法。
尺取法是一种常用的解决某些问题的算法技巧。它使用两个指针来遍历数组或序列,并根据问题的要求来调整指针的位置,从而求解问题。
尺取法通常用于滑动窗口类型的问题,其中需要在数组或序列中找到满足某些条件的子数组或子序列。尺取法的基本思想是维护一个窗口,通过移动窗口的左右边界来寻找满足条件的子数组或子序列。
尺取法的步骤如下:
- 初始化左右指针的位置,通常为数组或序列的开头。
- 进入循环,循环条件为右指针小于数组或序列的长度:
- 根据问题的要求,调整窗口的大小和位置,即移动左右指针。
- 在每次移动指针后,根据问题的要求更新结果或进行其他操作。
- 循环结束后,得到满足条件的子数组或子序列以及相应的结果。
尺取法的优点是时间复杂度较低,通常为 O(n),其中 n 是数组或序列的长度。它适用于一些需要遍历数组或序列的问题,例如求解最长连续子数组的和等。
尺取法的具体实现因问题而异,需要根据具体的问题来调整左右指针的移动规则和条件判断。在应用尺取法时,需要注意边界条件和指针的移动规则,确保算法的正确性。