(Leetcode) [String] Longest substring without repeating characters
Topic: String
Difficulty: Medium
Question
Given a string s, find the length of the longest substring without repeating characters.
์ ๋ชฉ ๊ทธ๋๋ก ๋ฌธ์์ด ๋ด์์ ๋ฐ๋ณต๋๋ ์ํ๋ฒณ์ด ์๋ ๊ฐ์ฅ ๊ธด ๋ถ๋ถ ๋ฌธ์์ด์ ์ฐพ๋ ๋ฌธ์ ์ด๋ค.
My first solution: time complexity O(n^2)
๋ฌธ์์ด์ ์ฒซ ์ํ๋ฒณ์ ๊ธฐ์ค์ ์ผ๋ก ์ก๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ฒ์งธ ์ํ๋ฒณ๋ถํฐ ์์ํด์ ์ฐจ๋ก๋๋ก unordered_set์ ์ ์ฅ์ ํ๋ค. ํ๋์ ์ ์ variable (int max)์ ์ธ์์ for loop์ด ํ๋ ๋ ๋๋ง๋ค ์ฆ๊ฐ์ํจ๋ค.
์ด๋, ๋ฐ๋ณต๋๋ ์ํ๋ฒณ์ด ๋์ค๋ฉด ๋ค์ ๊ธฐ์ค ์ํ๋ฒณ์ผ๋ก ๋์ด๊ฐ๋ค. ์ด๋ฐ์์ผ๋ก ๊ฐ์ฅ ํฐ max๋ฅผ ๋ฆฌํดํ๋ค.
๋ ๊ฐ์ for loop์ด ์ฌ์ฉ๋์๊ธฐ ๋๋ฌธ์ time complexity๋ O(n^2)์ด๋ค.
์ธํธ์ ๋งต์ด๋ผ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋ฐฐ์์ผ๋ก์จ ์กฐ๊ธ ๋ ์ฝ๊ฒ implement ํ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ ๋ฐฉ๋ฒ๋ค์ด ์๊ธด๋ค.
int lengthOfLongestSubstring(string s) {
if (s.length()==0)
return 0;
int max = -1;
int num = 0;
for (int i=0; i<s.length(); i++) {
unordered_set<char> set;
num = 0;
// vector<bool> set(26); // default values in set are false
for (int j=i; j<s.length(); j++) {
// if (set[s[j]-'a'])
// break;
// set[s[j]-'a']=true;
if (set.find(s[j]) != set.end())
break;
set.insert(s[j]);
num++;
}
cout << num << endl;
if (max<num)
max = num;
}
return max;
}
runtime์ด ์ด๋ง๋ฌด์ํ๋ค.
Second solution: time complexity O(n)
๋๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ด๋ฏธ ๊ฑฐ์ณ๊ฐ ์ํ๋ฒณ์ index๋ฅผ lastIndex๋ผ๋ ๋ฐฐ์ด์ ์ ์ฅํจ์ผ๋ก์จ linear time complexity๋ฅผ ๊ฐ๋ฅ์ผ ํ๋ค.
int i๋ฅผ starting index๋ก ๋๊ณ , int result๋ผ๋ ๋ณ์์ ์ต๋ ๊ธธ์ด๋ฅผ ์ ์ฅํ๋ค.
for loop ์์์,
- first line: ๋ง์ฝ ๋ฐ๋ณต๋๋ ์ํ๋ฒณ์ด ๋์ค๋ฉด, i์ 1์ ์ฆ๊ฐ์ํจ๋ค.
- second line: ๋ง์ฝ ํ์ฌ i์์ j๊น์ง์ ๊ธธ์ด๊ฐ ์ ์ผ ๊ธธ๋ฉด, result์ ์ ๋ฐ์ดํธ ์ํจ๋ค.
- third line: ๋งค๋ฒ ํน์ ์ํ๋ฒณ์ด ๋ง์ง๋ง์ผ๋ก ๋ํ๋๋ index๋ฅผ ์ ๋ฐ์ดํธ ์ํจ๋ค.
์ด๋ฐ ๋ฐ์์ ๋์ฒด ์ด๋ป๊ฒ ํ๋ ๊ฑธ๊น. ๋๋จํ๋ค.
int lengthOfLongestSubstring(string s) {
int result = 0;
// last index of all characters is initialized as -1
vector<int> lastIndex(256, -1); // number of chars = 256
int i = 0; // start of window
for (int j=0; j<s.length(); j++) {
i = max(i, lastIndex[s[j]+1]);
// update result if we get a larger window
result = max(result, j-i+1);
// update last index of j
lastIndex[s[j]] = j;
}
return result;
}
Summary
์ด ๋ฌธ์ ์์์ ๊ด๊ฑด์ ๋ชจ๋ ์ํ๋ฒณ์ ๊ธฐ์ค์ ์ผ๋ก ๋์ด์ ๊ฐ์ฅ ๊ธธ๊ฒ ๋์ค๋ ๋ถ๋ถ ๋ฌธ์์ด์ ์ฐพ์๋ ์ผ๋ง๋ ํจ์จ์ ์ผ๋ก ์ฐพ์์ ์๋์ง ์ด๋ค.
์ฒซ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ง๊ด์ ์ด์ง๋ง ๋ ๊ฐ์ for loop์ด ์ฌ์ฉ๋์ด์ time complexity๊ฐ O(n^2)์ด๋ค. ๋นํจ์จ์ ์ธ ํธ์ด๋ค.
๋๋ฒ์งธ ๋ฐฉ๋ฒ์ array๋ฅผ ์ด์ฉํด์ ๋ฐ๋ณต๋๋ ์ํ๋ฒณ์ index๋ฅผ ์ ์ฅํด์ ๊ธฐ์ค์ ์ ๊ณ์ ์ด๋์ํค๊ธฐ ๋๋ฌธ์ ํ๋์ ๋ฃจํ๋ง์ผ๋ก ๊ตฌํํ ์ ์๋ค.
๊ธฐ์ตํ์. ๋ฐ๋ณต๋๋ ์ํ๋ฒณ์ index๋ฅผ ์ ์ฅํด์ ํ๋์ ๋ฃจํ๋ก ํจ์จ์ฑ์ ์ฆ๊ฐ.
References
https://www.geeksforgeeks.org/length-of-the-longest-substring-without-repeating-characters/
Leave a comment