Algorithm/inflearn

★모든 아나그램 찾기(Hash, sliding Window : 시간복잡도 O(n))

마닐라 2021. 9. 16. 19:54

 

 

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

public class Main {
    public int solution(String a, String b) {
        int answer = 0;
        HashMap<Character, Integer> am = new HashMap<>();
        HashMap<Character, Integer> bm = new HashMap<>();
        //bacaAacba
        //abc

        //bm 먼저 세팅(abc)
        for(char x : b.toCharArray()) bm.put(x, bm.getOrDefault(x, 0) + 1);
        
        //b 한개 전만큼 am을 세팅 -> two pointer 사용을 위해서(ba)
        int L = b.length()-1; //2
        for(int i = 0; i < L; i++) am.put(a.charAt(i), am.getOrDefault(a.charAt(i), 0) + 1);

        //two pointer 시작
        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++;
        }
        //rt=2 일때 am은 0,1,2 이것저것 처리및비교 해주고 0번의 키를 가진 인덱스 추가하고 lt를 증가
        //rt=3 일때 am은 1,2,3
        return answer;
    }

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

        String a = kb.next();
        String b = kb.next();

        System.out.print(T.solution(a, b));



    }
}

'Algorithm > inflearn' 카테고리의 다른 글

#올바른 괄호  (0) 2021.09.17
★K번째 큰 수(TreeSet)  (0) 2021.09.16
★매출액의 종류(Hash, sliding Window)  (0) 2021.09.15
★아나그램(Hash)  (0) 2021.09.15
#학급 회장(Hash)  (0) 2021.09.15