모든 아나그램 찾기

최준호·2021년 8월 27일
0

알고리즘 강의

목록 보기
42/79

설명

S문자열에서 T문자열과 아나그램이 되는 S의 부분문자열의 개수를 구하는 프로그램을 작성하세요.

아나그램 판별시 대소문자가 구분됩니다. 부분문자열은 연속된 문자열이어야 합니다.

코드

public class EveryAnagram {
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        String input1 = in.next();
        String input2 = in.next();
        int solution = solution(input1, input2);
        System.out.println(solution);
    }
    public static int solution(String input1, String input2){
        int answer = 0;
        char[] chars1 = input1.toCharArray();
        char[] chars2 = input2.toCharArray();
        Map<String, Integer> map = new HashMap<>();
        for(char c : chars2){
            map.put(String.valueOf(c), map.getOrDefault(String.valueOf(c),0)+1);
        }

        int n = chars1.length;
        int k = chars2.length;
        Map<String, Integer> map2 = new HashMap<>();
        int lp = 0;
        for(int i = 0; i<k-1; i++){
            map2.put(String.valueOf(chars1[lp]),map2.getOrDefault(String.valueOf(chars1[lp]),0)+1);
            lp++;
        }
        lp = 0;
        for(int rp=k-1; rp<n; rp++){
            map2.put(String.valueOf(chars1[rp]),map2.getOrDefault(String.valueOf(chars1[rp]),0)+1);
            String key = String.valueOf(chars1[lp]);

            if(map.equals(map2)){
                answer++;
            }
            map2.put(key,map2.getOrDefault(key,0)-1);

            if(map2.get(key) == 0){
                map2.remove(key);
            }
            lp++;
        }
        return answer;
    }
}

이전에 학습했던 아나그램을 문자열에서 모두 찾아내는 코드이다. 시간 복잡도를 O(N)으로 풀어야하는 문제였으므로 sliding window 알고리즘을 활용했고 자료구조로는 hash를 사용했다.

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글