思路其实很简单:就是使用双指针/尺取法/追逐法(原理都一样)
先用一个指针从0开始向右找直到找到一个满足条件的解,并记录.
随后再用另一个指针从上次的起始位置(第一次是0)开始向后去除解中多余的元素,
当解不再成立时再用第一个指针向后寻找解,直到遍历完

Java AC代码1 使用HashMap:

import java.util.HashMap;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        char[] a = in.next().toCharArray();
        HashMap<Character, Integer> map = new HashMap<>();
        int s = 0, min = Integer.MAX_VALUE;

        for (int i = 0; i < a.length; ++i) {
            map.merge(a[i], 1, Integer::sum);
            if (map.size() == 26) {
                int j = s;
                for (; j < i; ++j) {
                    Integer ajv = map.get(a[j]);
                    if (ajv == 1) {
                        map.remove(a[j]);
                        min = Math.min(min, i - j + 1);
                        s = j + 1;
                        break;
                    } else
                        map.put(a[j], ajv - 1);
                }
            }
        }
        System.out.println(min);
    }
}

Java AC代码2更简洁:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        char[] s = in.next().toCharArray();
        int min = Integer.MAX_VALUE, ss = 26;
        int[] a = new int[129];
        int l = 0, r = 0, n = 0;
        while (r < s.length) {
            while (r < s.length && n < ss) {
                ++a[s[r++]];
                if (a[s[r - 1]] == 1)
                    ++n;
            }
            if (n == ss)
                min = Math.min(min, r - l);
            --a[s[l++]];
            if (a[s[l - 1]] == 0)
                --n;
        }
        System.out.println(min);
    }
}