すべての画像を検索


質問する

マイコード
//input
let str1 = "bacaAacba";
let str2 = "abc";

let map1 = new Map();
let map2 = new Map();
let answer = 0;
let lt = 0;
let num = 0;

// 각 char의 개수 구하기
function mapping(map, i) {
  if (map.has(i)) map.set(i, map.get(i) + 1);
  else map.set(i, 1);
  return map;
}

// str2의 map
for (let x of str2) {
  map1 = mapping(map1, x);
}
// str1의 map
for (let y of str1) {
  map2 = mapping(map2, y);
  num++;
  if (num === str2.length - 1) break; // str2.length-1 까지만 만들어 다음에  더할때 str2.length와 같게한다.
}

for (let rt = num; rt < str1.length; rt++) {
  // map2에 str1[lt]를 넣어줌
  let RT = str1[rt];
  if (map2.has(RT)) map2.set(RT, map2.get(RT) + 1);
  else map2.set(RT, 1);
  console.log("map2:", map2);
  // map1과 map2를 비교
  let tmp = true;
  for (let [key, value] of map1) {
    if (!map2.has(key) || map2.get(key) !== value) {
      tmp = false;
      break;
    }
  }
  if (tmp === true) answer++;
  // map2에서 str1[lt]를 빼줌
  let LT = str1[lt++];
  if (map2.get(LT) - 1 === 0) map2.delete(LT);
  else map2.set(LT, map2.get(LT) - 1);
}
console.log(answer);
ソリューション
  • str 2のmap 1を求める.
  • str 1のmap 2を求めます.
  • このときstr 2.length-1は、マッピングに要素を入れます.
  • loopでstr 1の文字をmap 2に入れます.
  • map 1とmap 2を比較した.
    map 1のkeyとvalueが一致する場合、tmp=true
    map 1のkeyとvalueが一致しない場合、tmp=falseはloopを解放します.
  • map 2からstr 1[lt](ltは0から)を減算した.
    keyにstr 1[lt]がある場合はvalue-1です.
    valueが0の場合、対応するkeyが削除されます.
  • コードの変更
    //input
    let str1 = "bacaAacba";
    let str2 = "abc";
    
    let sH = new Map();
    let tH = new Map();
    let answer = 0;
    let lt = 0;
    
    // 각 char의 개수 구하기
    function mapping(map, i) {
      if (map.has(i)) map.set(i, map.get(i) + 1);
      else map.set(i, 1);
      return map;
    }
    // sH와 tH비교함수
    function compareMaps(map1, map2) {
      for (let [key, value] of map2) {
        if (!map1.has(key)) return false;
        if (map1.get(key) !== value) return false;
      }
      return true;
    }
    // str2의 map
    for (let x of str2) {
      tH = mapping(tH, x);
    }
    // str1의 map
    let len = str2.length - 1;
    for (let i = 0; i < len; i++) {
      sH = mapping(sH, str1[i]);
    }
    
    for (let rt = len; rt < str1.length; rt++) {
      // map2에 str1[lt]를 넣어줌
      sH = mapping(sH, str1[rt]);
      // map1과 map2를 비교
      if (compareMaps(sH, tH)) answer++;
      // map2에서 str1[lt]를 빼줌
      let LT = str1[lt++];
      sH.set(LT, sH.get(LT) - 1);
      if (sH.get(LT) === 0) sH.delete(LT);
    }
    console.log(answer);
    mapの詳細(set,map,object)
    ソース:https://velog.io/@proxy/JSSet-Map-Object-クリア