4. 모든 아나그램 찾기
S문자열에서 T문자열과 아나그램이 되는 S의 부분문자열의 개수를 구하는 프로그램을 작성하
세요. 아나그램 판별시 대소문자가 구분됩니다. 부분문자열은 연속된 문자열이어야 합니다.
첫 줄에 첫 번째 S문자열이 입력되고, 두 번째 줄에 T문자열이 입력됩니다.
S문자열의 길이는 10,000을 넘지 않으며, T문자열은 S문자열보다 길이가 작거나 같습니다.
S단어에 T문자열과 아나그램이 되는 부분문자열의 개수를 출력합니다.
===================================================
먼저 아나그램이 되는 문자열을 HashMap에 저장해준다. 그 후 아나그램이 되는 문자열의 길이보다 하나 작은 값만큼 다른 문자열을 또 다른 HashMap에 저장해준다. 이제 for문을 이용하여 값을 하나씩 추가하여 같은지 비교한다. 같다면 값을 추가한다. 앞의 문자열부터 하나씩 값을 줄이고 0이 되면 키와 값을 모두 삭제한다.
import java.util.HashMap;
import java.util.Scanner;
public class Main {
public int solution(String a, String b){
int answer=0;
HashMap<Character, Integer> am=new HashMap<>();
HashMap<Character, Integer> bm=new HashMap<>();
for(char x : b.toCharArray()) bm.put(x, bm.getOrDefault(x, 0)+1);
int L=b.length()-1;
for(int i=0; i<L; i++) am.put(a.charAt(i), am.getOrDefault(a.charAt(i), 0)+1);
int lt=0;
for(int rt=L; rt<a.length(); rt++){
am.put(a.charAt(rt), am.getOrDefault(a.charAt(rt), 0)+1);
if(am.equals(bm)) answer++;
am.put(a.charAt(lt), am.get(a.charAt(lt))-1);
if(am.get(a.charAt(lt))==0) am.remove(a.charAt(lt));
lt++;
}
return answer;
}
public static void main(String[] args) {
Main main = new Main();
Scanner scan = new Scanner(System.in);
String str=scan.next();
String d=scan.next();
System.out.println(main.solution(str, d));
}
}
1) HashMap은 비교 가능