[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 |