[inflean]javascript 모든 아나그램 찾기(해쉬, 투포인터,슬라이딩 윈도우)

rondido·2022년 9월 2일
0

알고리즘

목록 보기
41/84
post-thumbnail

모든 아나그램 찾기


문제 설명

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

profile
개발 옆차기

0개의 댓글