[JAVA] 32. 모든 아나그램찾기

2021. 10. 23. 22:24
728x90

설명

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

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

입력

첫 줄에 첫 번째 S문자열이 입력되고, 두 번째 줄에 T문자열이 입력됩니다.

S문자열의 길이는 10,000을 넘지 않으며, T문자열은 S문자열보다 길이가 작거나 같습니다.

출력

S단어에 T문자열과 아나그램이 되는 부분문자열의 개수를 출력합니다.

예시 입력 1 

bacaAacba

abc

예시 출력 1

3

 

 


내 풀이

 

import java.util.*;
  
public class Main {
  public static void main(String[] args){
    Scanner in=new Scanner(System.in);
    String S = in.next();
        String T = in.next();

        int answer = 0;

        char[] arr = S.toCharArray();
        HashMap<Character, Integer> sMap = new HashMap<>();
        for(int i=0; i<T.length()-1; i++){
            sMap.put(arr[i], sMap.getOrDefault(arr[i],0)+1);
        }

        HashMap<Character, Integer> tMap = new HashMap<>();
        for(char ch : T.toCharArray()){
            tMap.put(ch , tMap.getOrDefault(ch, 0)+1);
        }

        int lt =0;
        for(int rt=T.length()-1; rt<S.length(); rt++){
            sMap.put(arr[rt],sMap.getOrDefault(arr[rt],0)+1);

			// 두 map의 비교
            // if(tMap.equals(bm)) answer ++;
            // 으로 수정할 수 있음.
            
            int cnt =0;
            for(char a : tMap.keySet()){
                if(tMap.containsKey(a) && sMap.get(a)==tMap.get(a)){
                    cnt ++;
                }
            }
            if(cnt == tMap.size()){
                answer ++;
            }
            
            //=================
            
            
            sMap.put(arr[lt], sMap.get(arr[lt])-1);
            if(sMap.get(arr[lt]) == 0){
                sMap.remove(arr[lt]);
            }
            lt++;
        }
        System.out.println(answer);
  }
}
728x90

'알고리즘 > JAVA' 카테고리의 다른 글

[JAVA] 34. 올바른 괄호 - stack  (0) 2021.10.24
[JAVA] 33. k번째 큰수 (TreeSet)  (0) 2021.10.23
[JAVA] 31. 매출액의 종류  (0) 2021.10.23
[JAVA] 30. 아나그램  (0) 2021.10.23
[JAVA] 29. 학급회장  (0) 2021.10.23

BELATED ARTICLES

more