๐ก ๋ฌธ์
๐ฏ ํ์ด ๊ณผ์
๋ฌธ์์ด s
์์ p
์ ์๋๊ทธ๋จ์ ๋ง์กฑํ๋ ๋ชจ๋ ๋ถ๋ถ ๋ฌธ์์ด์ ์์น๋ฅผ ์ฐพ๋ ๋ฌธ์ ์
๋๋ค.
๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ๊ณ ๋ คํด์ ์ต์ ์ ์๊ฐ ๋ณต์ก๋๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผํ๋๋ฐ, sliding window
๋ฅผ ํ์ฉํ๋ฉด
O(n)
์ ๋ชจ๋ ์์น์์ ์๋๊ทธ๋จ์ ํ๋จํ ์ ์์ต๋๋ค.
๋จผ์ p
๋ฅผ ๊ตฌ์ฑํ๋ ๋ฌธ์ ๋น๋์ ํด์๋งต์ ์์ฑํฉ๋๋ค.
์ดํ ๋ ๊ฐ์ ํฌ์ธํฐ left
์ right
, ์๋๊ทธ๋จ ๊ตฌ์ฑ์ ํ์ํ ๋ฌธ์ ๊ฐ์์ ํฉ์ ์ํ count
๋ฅผ ์ ์ํฉ๋๋ค.
count
๊ฐ 0์ด ๋๋ฉด ๋ชจ๋ ๋ฌธ์๋ค์ด ํ์ํ ๋น๋์๋งํผ ๋ฐ๊ฒฌ๋์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
window
์ ํฌ๊ธฐ๋ ๊ณง p
์ ๊ธธ์ด์ ๊ฐ๊ธฐ ๋๋ฌธ์ left
์ right
๊ฐ์ ๊ฐ๊ฒฉ์ด window size
์ ๋๋ฌํ๋ฉด
left
๋ฅผ ํ๋ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฎ๊ฒจ์ฃผ๋ ๊ณผ์ ์ ์ํํฉ๋๋ค.
์ด๋ ์ด ๋ฌธ์๊ฐ ์๋๊ทธ๋จ ๊ตฌ์ฑ์ ํ์ํ๋ ๋ฌธ์๋ผ๋ฉด count
๋ฅผ ํ๋ ์ฆ๊ฐ์์ผ์ค๋๋ค.
๐จ๐ป ์ฝ๋
/**
* @param {string} s
* @param {string} p
* @return {number[]}
*/
var findAnagrams = function(s, p) {
const needed = freq(p)
const windowSize = p.length
if (windowSize > s.length) {
return []
}
let left = 0
let right = 0
let count = p.length
const answer = []
while (right < s.length) {
if (needed[s[right]] > 0) {
count -= 1
}
needed[s[right]] -= 1
if (count === 0) {
answer.push(left)
}
const isMaxWindowSize = (right - left + 1) === windowSize
if (isMaxWindowSize) {
if (needed[s[left]] >= 0) {
count += 1
}
needed[s[left]] += 1
left += 1
}
right += 1
}
return answer
};
function freq(str) {
const result = {}
for (let idx = 0; idx < str.length; idx += 1) {
const char = str[idx]
if (char in result) {
result[char] += 1
} else {
result[char] = 1
}
}
return result
}
'๐ algorithm > leetcode' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
LeetCode 328 - Odd Even Linked List (Medium) (0) | 2023.05.29 |
---|---|
LeetCode 704 - Binary Search (Easy) (0) | 2023.05.14 |
LeetCode 42 - Trapping Rain Water (Hard) (0) | 2023.04.30 |
LeetCode 238 - Product of Array Except Self (Medium) (2) | 2023.04.24 |
LeetCode 2390 - Removing Stars From a String (Medium) (0) | 2023.04.24 |
๐ฌ ๋๊ธ