[알고리즘] 04.HashMap, TreeSet / 04. 모든 아나그램 찾기

less than 1 minute read

모든 아나그램 찾기

설명

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;
	}
}