인식을 할 수 있는 알파벳의 개수가 N으로 주어진다. (1<=N<=26 , 알파벳의 개수)
두번 째에는 String이 주어지는데 문자열의 길이는 1 <= 문자열 <= 100,000
문자열에서 인식할 수 있는 개수 내에서 가장 긴 길이를 구하여라
import java.io.*;
import java.util.*;
public class Main {
static int N,kind;
static String A;
static int[] cnt;
static FastReader scan = new FastReader();
static StringBuilder sb = new StringBuilder();
static void input() {
N = scan.nextInt(); // 인식가능한 알파벳의 개수
A = scan.nextLine(); // 문자열 인식
cnt = new int[26]; // 알파벳을 구분하기 위해 'a'를 빼 배열의 인덱스 //값으로 구분을 한다.
}
static void add(char x) {
cnt[x-'a']++; // 입력받은 x에서 -'a'를 하여 인덱스 값을 구한다.
if(cnt[x-'a']==1) { // 처음 입력을 받는다면 kind(사용되고 있는 알파벳
kind++; // 의개수를 파악하기 위한 int변수)를 1증가한다.
}
}
static void erase(char x) {
cnt[x-'a']--; // 입력받은 x에서 -'a'를 하여 인덱스 값을 구한다.
if(cnt[x-'a']==0) {
kind--;
}
}
static void find() {
int len = A.length(), ans =0;
for(int R=0,L=0;R<len;R++) {
add(A.charAt(R)); // R을 움직이고 해당 하는 문자를 추가한다.
while(kind > N) { // 만약 인식할 수 있는 알파벳의 개수를 초과한다
// 면 erase를 통해 L을 우측으로 한칸 이동한다.
erase(A.charAt(L++)); //(kind가 N과 같을 때 까지)
}
ans = Math.max(ans, R-L+1); //길이를 비교하여 가장 긴 길이를 구 // 한다.
}
System.out.println(ans);
}
public static void main(String[] args) {
input();
find();
}
static class FastReader{
BufferedReader br;
StringTokenizer st;
public FastReader() {
br = new BufferedReader(new InputStreamReader(System.in));
}
public FastReader(String s) throws FileNotFoundException {
br = new BufferedReader(new FileReader(new File(s)));
}
String next() {
while(st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch(IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}
int nextInt() {
return Integer.parseInt(next());
}
Long nextLong() {
return Long.parseLong(next());
}
double nextDouble(){
return Double.parseDouble(next());
}
String nextLine() {
String str = "";
try {
str = br.readLine();
}catch(IOException e) {
e.printStackTrace();
}
return str;
}
}
}