思路:尺取法
本篇题解适合小白参考,尤其是没有接触过尺取法的小白。
尺取法顾名思义就像一把尺子一样一点一点截取一个区间。
就照这个题来说。
我们需要让一个区间内26个字母都出现过并且长度最短。
我们就可以设置l和r作为指针使用指向下标0的地方。
然后将r一点一点向右挪动,我们需要挪动到什么时候呢,当然是满足题意的时候。
当我们挪动到一个位置使得[l,r]中包含了26个字母。我们停止挪动。
这时候我们需要干什么呢,我们就需要挪动左边的l指针,一点一点的往右挪动,直到不符合我们的条件之后,记录这一个区间的长度。
反反复复直到尾部即可。
import java.math.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.*;
public class Main {
public static void main(String args[])throws IOException
{
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
in.nextToken();
String s = in.sval;
int num[] = new int[26];
int min=99999999;
if(s.length()<=26)
out.println(26);
else
{
int sum=0,l=0,r=0;
while(l<s.length()-25&&r<s.length())
{
if(sum<26)
{
if(num[s.charAt(r)-'a']==0)
sum++;
num[s.charAt(r)-'a']++;
if(sum<26)
r++;
else{
min = Math.min(min,r-l+1);
}
}
if(sum>=26)
{
num[s.charAt(l)-'a']--;
if(num[s.charAt(l)-'a']==0)
sum--;
if(sum<26)
{
min = Math.min(min,r-l+1);
r++;
}
l++;
}
}
out.println(min);
}
out.flush();
}
}
京公网安备 11010502036488号