S문자열에서 T문자열과 아나그램이 되는 S의 부분문자열의 개수를 구하는 프로그램을 작성하
세요. 아나그램 판별시 대소문자가 구분됩니다. 부분문자열은 연속된 문자열이어야 합니다.
▣ 입력설명
첫 줄에 첫 번째 S문자열이 입력되고, 두 번째 줄에 T문자열이 입력됩니다.
S문자열의 길이는 10,000을 넘지 않으며, T문자열은 S문자열보다 길이가 작거나 같습니다.
▣ 출력설명
S단어에 T문자열과 아나그램이 되는 부분문자열의 개수를 출력합니다.
▣ 입력예제 1
bacaAacba
abc
▣ 출력예제 1
3
//애나 그램
//sliding window tow pointers hash Map
//sh,th 두개의 맵이 같은지 아닌지 판별
function compareMaps(map1, map2) {
//map1.size는 키의 종류
if (map1.size !== map2.size) return false;
for (let [key, val] of map1) {
//key의 값은 map1 있는 값
//밑에서의 key값은 map2의 key에 해당하는 value값
//val은 map1의 value 값
if (!map2.has(key) || map2.get(key) !== val) return false;
}
return true;
}
function solution(s, t) {
let answer = 0;
let tH = new Map();
let sH = new Map();
for (let x of t) {
if (tH.has(x)) tH.set(x, tH.get(x) + 1);
else tH.set(x, 1);
}
let len = t.length - 1;
// b,a
for (let i = 0; i < len; i++) {
if (sH.has(s[i])) sH.set(s[i], sH.get(s[i]) + 1);
else sH.set(s[i], 1);
}
let lt = 0;
//two pointer
// sliding window
//밑에 포문에서 3번째값인c를 추가 if(compareMaps에서 비교) sH,tH가 같은지 비교
for (let rt = len; rt < s.length; rt++) {
//추가
if (sH.has(s[rt])) sH.set(s[rt], sH.get(s[rt]) + 1);
else sH.set(s[rt], 1);
//비교
if (compareMaps(sH, tH)) answer++;
sH.set(s[lt], sH.get(s[lt]) - 1);
//map의 키에 해당하는 value 값이 0이면 삭제 후 rt로 한칸앞으로 이동
//lt가 rt를 따라가는 형식
//빼기
if (sH.get(s[lt]) === 0) sH.delete(s[lt]);
lt++;
}
return answer;
}
let a = "bacaAacba";
let b = "abc";
console.log(solution(a, b));