https://www.acmicpc.net/problem/16472
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.StringTokenizer;
public class Main {
static int N;
static char[] alphabets;
static int[] count;
static void input() {
Reader scanner = new Reader();
N = scanner.nextInt();
alphabets = scanner.nextLine().toCharArray();
count = new int[26];
}
static void solution() {
int ans = 1, cnt = 1;
HashSet<Character> kinds = new HashSet<>();
count[alphabets[0] - 'a']++;
kinds.add(alphabets[0]);
for(int L = 0, R = 0; L < alphabets.length; L++) {
while(R + 1 < alphabets.length) {
if(!kinds.contains(alphabets[R + 1])) {
if(cnt + 1 >= (N + 1)) break;
kinds.add(alphabets[R + 1]);
count[alphabets[R + 1] - 'a']++;
cnt++;
} else {
count[alphabets[R + 1] - 'a']++;
}
R++;
}
ans = Math.max(ans, R - L + 1);
count[alphabets[L] - 'a']--;
if(count[alphabets[L] - 'a'] == 0) {
kinds.remove(alphabets[L]);
cnt--;
}
}
System.out.println(ans);
}
public static void main(String[] args) {
input();
solution();
}
static class Reader {
BufferedReader br;
StringTokenizer st;
public Reader() {
br = new BufferedReader(new InputStreamReader(System.in));
}
String next() {
while(st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return st.nextToken();
}
int nextInt() {
return Integer.parseInt(next());
}
String nextLine() {
String str = "";
try {
str = br.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return str;
}
}
}
인식할 수 있는 문자열의 시작 부분을 고정시켜놓고 한 문자씩 추가해보면서 해당 문자를 추가했을 때 인식할 수 있는 알파벳의 종류의 최대 개수 N을 넘는지 확인하고 넘지 않는다면 다음 문자를 추가하고 넘는다면 시작 부분을 한 칸 미룬 후에 다음 문자들을 추가해보면서 인식할 수 있는 문자열을 찾습니다.