카테고리 없음

[JAVA] 알고리즘 : Hash, sliding window - 모든 아나그램 찾기

연듀 2022. 7. 5. 14:27
import java.util.*;

class Main {

    public int solution(String a, String b) {
        int answer = 0;

        HashMap<Character, Integer> am = new HashMap<>();
        HashMap<Character, Integer> bm = new HashMap<>();

        for(char x : b.toCharArray()) bm.put(x, bm.getOrDefault(x, 0)+1);
        int L = b.length()-1;
        for(int i=0; i<L; i++) am.put(a.charAt(i), am.getOrDefault(a.charAt(i), 0)+1);
        int lt = 0;
        for(int rt=L; rt<a.length(); rt++){
            am.put(a.charAt(rt), am.getOrDefault(a.charAt(rt), 0)+1);
            if(am.equals(bm)) answer++;
            am.put(a.charAt(lt), am.get(a.charAt(lt))-1);
            if(am.get(a.charAt(lt)) == 0) am.remove(a.charAt(lt));
            lt++;
        }
        return answer;
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner sc = new Scanner(System.in);

        String a = sc.next();
        String b = sc.next();
        System.out.println(T.solution(a,b));
    }
}

 

포함되어야 할 문자열을 일단 총 길이-1만큼 키와 값을 세팅하고,

rt를 총길이의 인덱스부터 시작하여 하나씩 증가하고 lt는 하나씩 감소하며 sliding window로 밀고 나간다.

그와 동시에 포함되어야할 문자열과 비교하면서 같으면 답을 증가시킨다.

이 때도 lt가 감소되다 0이 되면 hashMap에서 지워줘야한다.