λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸƒ algorithm/leetcode

LeetCode 187 - Repeated DNA Sequences (Medium)

by HandHand 2021. 3. 3.

문제

LeetCode - 187번

풀이 κ³Όμ •

주어진 λ¬Έμžμ—΄μ—μ„œ 10자 μ΄μƒμ˜ λΆ€λΆ„ λ¬Έμžμ—΄ 쀑 2번 이상 λ°˜λ³΅λ˜λŠ” λͺ¨λ“  λΆ€λΆ„ λ¬Έμžμ—΄μ˜ μ’…λ₯˜λ₯Ό μ°ΎλŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

ν•΄μ‹œ ν…Œμ΄λΈ” λ₯Ό μ‚¬μš©ν•˜λ©΄ O(N) 에 λͺ¨λ“  경우λ₯Ό 탐색할 수 μžˆμŠ΅λ‹ˆλ‹€.
이외에도 두 개의 Set 을 μ‚¬μš©ν•˜λ©΄ λ™μΌν•œ λ‘œμ§μ„ μˆ˜ν–‰ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. (κ΅¬ν˜„μ€ 이게 더 κΉ”λ”ν•œ 것 κ°™μŠ΅λ‹ˆλ‹€ πŸ˜„)

μ½”λ“œ

/**
 * @param {string} s
 * @return {string[]}
 */
var findRepeatedDnaSequences = function (s) {
  if (s.length < 10) return [];

  const cache = new Map();

  for (let i = 0, len = s.length; i <= len - 10; i++) {
    const substring = s.slice(i, i + 10);

    if (cache.has(substring)) {
      const quantity = cache.get(substring);
      cache.set(substring, quantity + 1);
    } else {
      cache.set(substring, 0);
    }
  }

  const answer = [...cache.entries()].reduce((acc, [key, value]) => {
    if (value >= 1) acc.push(key);
    return acc;
  }, []);

  return answer;
};
λ°˜μ‘ν˜•

πŸ’¬ λŒ“κΈ€