Skip to content

Commit 457b29a

Browse files
committed
longest substring without repeating characters solution
1 parent 5896955 commit 457b29a

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/***
2+
* @problem
3+
* ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์—์„œ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ๋ฌธ์ž๋กœ ์ด๋ฃจ์–ด์ง„ ๊ฐ€์žฅ ๊ธด ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
4+
*
5+
* @constraints
6+
* - ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋Š” 0 ์ด์ƒ 5 * 10^4 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
7+
* - ๋ฌธ์ž์—ด์€ ASCII ๋ฌธ์ž๋กœ๋งŒ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.
8+
*
9+
* @example
10+
* - ์ž…๋ ฅ: "abcabcbb"
11+
* ์ถœ๋ ฅ: 3 ("abc")
12+
* - ์ž…๋ ฅ: "bbbbb"
13+
* ์ถœ๋ ฅ: 1 ("b")
14+
* - ์ž…๋ ฅ: "pwwkew"
15+
* ์ถœ๋ ฅ: 3 ("wke")
16+
*
17+
* @description
18+
* - ASCII ๋ฌธ์ž์˜ ๋งˆ์ง€๋ง‰ ์œ„์น˜๋ฅผ ์ €์žฅํ•  ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
19+
* - ์ค‘๋ณต ๋ฌธ์ž๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ์‹œ์ž‘ ์ง€์ ์„ ํ•ด๋‹น ๋ฌธ์ž์˜ ๋งˆ์ง€๋ง‰ ์œ„์น˜ ๋‹ค์Œ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
20+
* - ํ˜„์žฌ ์„œ๋ธŒ์ŠคํŠธ๋ง์˜ ๊ธธ์ด๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ์ตœ๋Œ€ ๊ธธ์ด๋ฅผ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.
21+
*
22+
* @complexity
23+
* - ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n)
24+
* ใ„ด ๋ฌธ์ž์—ด์„ ํ•œ ๋ฒˆ ์ˆœํšŒํ•˜๋ฉฐ ๊ฐ ๋ฌธ์ž๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
25+
* - ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
26+
* ใ„ด ๊ณ ์ • ํฌ๊ธฐ ๋ฐฐ์—ด(128)์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” ์ƒ์ˆ˜์ž…๋‹ˆ๋‹ค.
27+
*/
28+
function lengthOfLongestSubstring(s: string): number {
29+
// ASCII ๋ฌธ์ž์˜ ๋งˆ์ง€๋ง‰ ์œ„์น˜๋ฅผ ์ €์žฅํ•  ๋ฐฐ์—ด (128 ํฌ๊ธฐ, ์ดˆ๊ธฐ๊ฐ’ -1)
30+
const lastSeenIndex = Array(128).fill(-1);
31+
let substringStart = 0;
32+
let longestLength = 0;
33+
34+
for (let currentIndex = 0; currentIndex < s.length; currentIndex++) {
35+
const currentCharCode = s.charCodeAt(currentIndex);
36+
37+
// ์ค‘๋ณต ๋ฌธ์ž๊ฐ€ ๋ฐœ๊ฒฌ๋˜์—ˆ๊ณ , ๊ทธ ๋ฌธ์ž์˜ ๋งˆ์ง€๋ง‰ ์œ„์น˜๊ฐ€ ํ˜„์žฌ ์‹œ์ž‘์  ์ดํ›„๋ผ๋ฉด
38+
if (lastSeenIndex[currentCharCode] >= substringStart) {
39+
// ์‹œ์ž‘ ์ง€์ ์„ ์ค‘๋ณต ๋ฌธ์ž์˜ ๋‹ค์Œ ์œ„์น˜๋กœ ์ด๋™
40+
substringStart = lastSeenIndex[currentCharCode] + 1;
41+
}
42+
43+
// ํ˜„์žฌ ๋ฌธ์ž์˜ ์œ„์น˜๋ฅผ ๋ฐฐ์—ด์— ์ €์žฅ
44+
lastSeenIndex[currentCharCode] = currentIndex;
45+
46+
// ํ˜„์žฌ ์„œ๋ธŒ์ŠคํŠธ๋ง์˜ ๊ธธ์ด๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ์ตœ๋Œ€๊ฐ’ ๊ฐฑ์‹ 
47+
longestLength = Math.max(longestLength, currentIndex - substringStart + 1);
48+
}
49+
50+
return longestLength;
51+
}
52+
53+
// ํ…Œ์ŠคํŠธ
54+
console.log(lengthOfLongestSubstring("abcabcbb")); // ์ถœ๋ ฅ: 3
55+
console.log(lengthOfLongestSubstring("bbbbb")); // ์ถœ๋ ฅ: 1
56+
console.log(lengthOfLongestSubstring("pwwkew")); // ์ถœ๋ ฅ: 3

0 commit comments

Comments
ย (0)