모든 아나그램 찾기
설명
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;
    }
}
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를 사용했다.
Author And Source
이 문제에 관하여(모든 아나그램 찾기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ililil9482/모든-아나그램-찾기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)