모든 아나그램 찾기(시간복잡도 O(n) Hash,sliding window)

Seungmin Lim·2022년 2월 11일
0

코딩문제연습

목록 보기
37/63

문제

나의풀이

import java.util.*;

class Main {
	public int solution(String s, String t) {
			int answer = 0, lt = 0;
			int len = t.length();
			
			HashMap<Character, Integer> sMap = new HashMap<>();
			HashMap<Character, Integer> tMap = new HashMap<>();
			//초기값
			for(char x : t.toCharArray()) tMap.put(x, tMap.getOrDefault(x, 0)+1);
			for(int i=0; i<len-1; i++) sMap.put(s.charAt(i), sMap.getOrDefault(s.charAt(i), 0)+1);
			//rt 추가
			for(int rt=len-1; rt<s.length(); rt++) {
				sMap.put(s.charAt(rt), sMap.getOrDefault(s.charAt(rt), 0)+1);
				//아나그램일시 answer++
				if(sMap.equals(tMap)) answer++;
				//lt값 빼기
				sMap.put(s.charAt(lt), sMap.get(s.charAt(lt))-1);
				if(sMap.get(s.charAt(lt)) == 0) sMap.remove(s.charAt(lt));
				lt++;
			}
			
			return answer;
	}
		    
	public static void main(String[] args) {
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		String s = kb.next();
		String t = kb.next();
		System.out.println(T.solution(s,t))	;
	}
	
}

풀이방법

판별문자(t)를 해쉬맵에 넣고 비교할 문자(s)를 초기값으로 t의 len-1전까지 해쉬맵에 넣었다.
lt가 rt를 쫓아가는 sliding window를 통해
1) rt값을 넣는다

2) smap과 tmap을 비교한다(.equals)
++2.1) if(smap.equals(tmap)) answer++;

3) lt값을 빼준다.
++3.1) if(smap.get(s.charAt(lt)) == 0) 해당 lt의 key를 remove

4) lt 1증가

핵심키워드

hashmap에서 .equals()메소드는
두 hashmap의 모든 key의 종류와 value를 모두 비교해 전부 같은지 확인한다.

0개의 댓글