Study Anything ๐ง
438. Find All Anagrams in a String - Trial 2 ๋ณธ๋ฌธ
438. Find All Anagrams in a String - Trial 2
์ 2022. 2. 3. 23:48#HashTable #String #SlidingWindow
๋ ๋ฌธ์์ด s์ p๊ฐ ์ฃผ์ด์ง๋ค. ์ด ๋ p์ ๋ชจ๋ ๋ฌธ์๊ฐ ์ฌ์ฉ๋ s์ ์์ ์ธ๋ฑ์ค๋ฅผ ๋ฆฌ์คํธ๋ก ๋ฐํํ๋ค.
๋จ, ๋ฐํํ๋ ๋ฆฌ์คํธ ์์ ์์ ์์๋ ์๊ด์ด ์๋ค.
* ์ ๋๊ทธ๋จ(Anagram)์ด๋?
๋จ์ด๋ ๊ตฌ์ ๊ธ์๋ฅผ ์ฌ๋ฐฐ์นํ์ฌ ๋ง๋ ๋จ์ด๋ ๊ตฌ๋ฌธ์ผ๋ก, ๋ชจ๋ ๊ธ์๋ฅผ ํ ๋ฒ์ฉ๋ง ์ฌ์ฉํ๋ค.
์์:
(Input) s = "cbaebabacd", p = "abc"
(Output) [0,6]
Trial 2 : Python3, 22/02/03
class Solution:
def findAnagrams(self, s: str, p: str) -> List[int]:
result = []
phash = defaultdict(int)
shash = defaultdict(int)
for char in p:
phash[char] += 1
for idx, char in enumerate(s):
shash[char] += 1
# ๋์ ๋ ๋ฌธ์ ์์์๋ถํฐ ํ๋์ฉ ์ ๊ฑฐํ๊ธฐ
if idx >= len(p):
delchar = s[idx-len(p)]
if shash[delchar] > 1:
shash[delchar] -= 1
elif shash[delchar] == 1:
del shash[delchar]
if phash == shash:
result.append(idx + 1 - len(p))
return result
ํ์ด:
์ด์ ์ ํ์ด์ ์ฌ์ฉํด๋ด์ผ๊ฒ ๋ค๊ณ ํ HashTable(์ดํ HT) ๊ธฐ๋ฅ๊ณผ Sliding Window ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
* Sliding Window ์๊ณ ๋ฆฌ์ฆ:
์ผ์ ๋ฒ์์ ๋ฐฐ์ด์ ํ์ํ๊ฑฐ๋ ๋น๊ตํ ๋ ์ค๋ณต๋๋ ๋ฒ์๋ฅผ ์ฌ์ฌ์ฉํ๋ค.
๋จผ์ p ๋ฌธ์์ด์ HT๋ฅผ ์์ฑํ๋ค. (๋น๊ตํ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํฐ ๊ตฌ์ถ)
์ฐธ๊ณ ๋ก defaultdict(int)์ ์ฌ์ฉํ๋ฉด ์๋์ผ๋ก ๊ฐ์ 0์ผ๋ก ์ฑ์์ฃผ๊ธฐ ๋๋ฌธ์ ๋ณ๋๋ก ์ด๊ธฐํ ํ ํ์๊ฐ ์๋ค.
๋ค์์ผ๋ก s ๋ฌธ์์ด ๋ด์์ ํ ๋ฌธ์์ฉ ํ์ํ๋ฉด์ ์๋ก์ด ๊ฐ์ ์ถ๊ฐํ๊ณ ์ค๋๋ ๊ฐ์ ์ญ์ ํด์ฃผ๋ฉด ๋๋๋ฐ,
์ด ๋ for ๋ฐ๋ณต๋ฌธ์์ ์ฌ์ฉํ๋ enumerate(์๋ฃํ) ํจ์๋ ์์๊ฐ ์๋ ์๋ฃํ์ ๋ฐ์์ ์ธ๋ฑ์ค์ ๊ฐ์ ํจ๊ป ๋ฐํํ๋ค.
์ฆ, ์์ ์ฝ๋์ ๊ฒฝ์ฐ s ๋ฌธ์์ด์ ์ ๋ ฅ๊ฐ์ผ๋ก ์ฃผ์์ผ๋ฏ๋ก s[idx] == char ๋ฅผ ๋ง์กฑํ๋ค.
s ๋ฌธ์์ด์ HT์ ์ฐจ๋ก๋๋ก ํ๋์ฉ ์ถ๊ฐํ๋ค๊ฐ ์ธ๋ฑ์ค๊ฐ p ๋ฌธ์์ด์ ํฌ๊ธฐ์ ๊ฐ์์ง ์ดํ๋ถํฐ๋
๊ฐ์ฅ ์ค๋๋ ๊ฐ์ ํ๋์ฉ ์ญ์ ํด์ฃผ์ด์ผ ํ๋ค.
๋ฐ๋ผ์ ์ง์์ผ ํ ๋ฌธ์๋ฅผ delchar ๋ณ์์ ์ ์ฅํ๊ณ sHT ์์ ํด๋น ๋ฌธ์์ ๊ฐ์๊ฐ 1๋ณด๋ค ํฐ ๊ฒฝ์ฐ์๋ 1์ ๋นผ์ฃผ๊ณ ,
๊ฐ์๊ฐ 1์ธ ๊ฒฝ์ฐ์๋ ํด๋น ์์ ์์ฒด๋ฅผ ์ญ์ ํ๋ค.
์์ ์์ฒด๋ฅผ ์ญ์ ํ๋ ์ด์ ๋ pHT ์ ๋น๊ตํ ๋ ์์๊ฐ ๋จ์์์ผ๋ฉด ์ ๋๋ก ๋น๊ต๊ฐ ์ด๋ค์ง์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด ๊ณผ์ ์ ๊ฑฐ์น ํ์ pHT ์ sHT ๋ฅผ ๋น๊ตํด์ ๋ ๋์ ๋๋ฆฌ๊ฐ ๊ฐ๋ค๋ฉด ๊ฐ์ฅ ์ฒ์์ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ๋ค.
(ํ์ฌ ์ธ๋ฑ์ค๊ฐ ์ ๋๊ทธ๋จ์ ๋ง์ง๋ง ์ธ๋ฑ์ค๋ฅผ ๋ํ๋ด๋ฏ๋ก p ๋ฌธ์์ด ๊ธธ์ด๋งํผ ๋นผ๊ณ 1์ ๋ํด์ฃผ์ด์ผ ํ๋ค.)
๋ฆฌ๋ทฐ:
๋ฐํ์์ 88.17%, ๋ฉ๋ชจ๋ฆฌ๋ 77.56% ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์๋ค.
์ฒซ ์๋์์๋ ์นดํ ๊ณ ๋ฆฌ์ ์๊ด์์ด ๋ ์ค๋ฅด๋ ๋ฐฉ๋ฒ๋๋ก ํ์ด์
๊ฐ๋จํ ๊ฒฝ์ฐ๋ ํด๊ฒฐํ์ง๋ง ์ฃผ์ด์ง ๋ฌธ์์ด์ด ๋ณต์กํ ๊ฒฝ์ฐ์๋ ํ์๋ฆฌ๋ฐ์ ๊ฑธ๋ ธ๋ค.
๋ ๋ฒ์งธ์๋ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ์ ๋ ํ๋ฉด์ ์ฌ์ฉํด์ผ ํ ๋๊ตฌ(HashTable)์ ๊ด๋ จ๋ ์๊ณ ๋ฆฌ์ฆ ๊ธฐ๋ฒ(Sliding Window)์ ์ฐธ๊ณ ํด์ ํ์๊ณ ์ฒซ ๋ฒ์งธ๋ณด๋ค ํจ์ฌ ์ผ๋ฐ์ ์ธ ํด๊ฒฐ๋ฒ์ ์ป์ ์ ์์๋ค.
์๊ณ ์๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์ ์ฐพ์๋ณด๊ณ ํด๊ฒฐ๋ฒ์ ์ ์ฉํ๋ฉด์
์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ค์ ํธ๋ ์๋ฏธ๋ฅผ ๋ค์ ์๊ฐํด ๋ณผ ์ ์๋ ๊ธฐํ์๋ค.
'์๊ณ ๋ฆฌ์ฆ๋ฌธ์ ํ์ด > LeetCode' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
1637. Widest Vertical Area Between Two Points Containing No Points (0) | 2022.02.11 |
---|---|
1108. Defanging an IP Address (0) | 2022.02.10 |
438. Find All Anagrams in a String (0) | 2022.02.02 |
1305. All Elements in Two Binary Search Trees (0) | 2022.01.27 |
520. Detect Capital (0) | 2022.01.24 |