[알고리즘] 04.HashMap, TreeSet / 04. 모든 아나그램 찾기
모든 아나그램 찾기
설명
S문자열에서 T문자열과 아나그램이 되는 S의 부분문자열의 개수를 구하는 프로그램을 작성하세요.
아나그램 판별시 대소문자가 구분됩니다. 부분문자열은 연속된 문자열이어야 합니다.
입력
첫 줄에 첫 번째 S문자열이 입력되고, 두 번째 줄에 T문자열이 입력됩니다.
S문자열의 길이는 10,000을 넘지 않으며, T문자열은 S문자열보다 길이가 작거나 같습니다.
출력
S단어에 T문자열과 아나그램이 되는 부분문자열의 개수를 출력합니다.
예시 입력 1
bacaAacba
abc
예시 출력 1
3
느낀점
런타임 오류가 나오는데, 왤까 조금 더 생각해봐야겠다
코드
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Main T = new Main();
Scanner sc = new Scanner(System.in);
String s = sc.next();
String t = sc.next();
System.out.print(T.solution(s, t));
}
/*
bacaAacba
abc
*/
public int solution(String s, String t) {
int answer = 0;
HashMap<Character, Integer> sHm = new HashMap<>();
HashMap<Character, Integer> tHm = new HashMap<>();
for(char x : t.toCharArray()) {
tHm.put(x, tHm.getOrDefault(x, 0)+1);
}
int tL = t.length()-1;
for(int i=0; i<tL; i++) { // 0,1
sHm.put(s.charAt(i), sHm.getOrDefault(s.indexOf(i), 0)+1);
}
int lt=0;
for(int rt=tL; rt<s.length(); rt++) {
sHm.put(s.charAt(rt), sHm.getOrDefault(s.charAt(rt), 0)+1);
if(sHm.equals(tHm)) {
answer ++;
}
sHm.put(s.charAt(lt), sHm.get(s.charAt(lt))-1);
if(sHm.get(s.charAt(lt)) == 0) {
sHm.remove(s.charAt(lt));
}
lt++;
}
return answer;
}
}