From 08965a3335a9916b0a36485eaf05c73f31c02800 Mon Sep 17 00:00:00 2001 From: mike <59136831+Mike0121@users.noreply.github.com> Date: Sat, 1 Jun 2024 16:42:45 +0900 Subject: [PATCH 1/2] Create 3. Longest Substring Without Repeating Characters.md https://leetcode.com/problems/longest-substring-without-repeating-characters/description/ --- ...Substring Without Repeating Characters.md" | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 "\347\253\266\346\212\200\343\203\227\343\203\255\345\260\261\346\264\273\351\203\250PR\347\224\250/3. Longest Substring Without Repeating Characters.md" diff --git "a/\347\253\266\346\212\200\343\203\227\343\203\255\345\260\261\346\264\273\351\203\250PR\347\224\250/3. Longest Substring Without Repeating Characters.md" "b/\347\253\266\346\212\200\343\203\227\343\203\255\345\260\261\346\264\273\351\203\250PR\347\224\250/3. Longest Substring Without Repeating Characters.md" new file mode 100644 index 0000000..5246f31 --- /dev/null +++ "b/\347\253\266\346\212\200\343\203\227\343\203\255\345\260\261\346\264\273\351\203\250PR\347\224\250/3. Longest Substring Without Repeating Characters.md" @@ -0,0 +1,48 @@ +## Sliding Window(set)による解法 ★ +--- +### 1回目 (3m20s) +時間計算量: O(N)
+空間計算量: O(N) + +```python +class Solution: + def lengthOfLongestSubstring(self, s: str) -> int: + left = 0 + max_length = 0 + letters_in_windows = set() + + for right in range(len(s)): + while s[right] in letters_in_windows: + letters_in_windows.discard(s[left]) + left += 1 + + letters_in_windows.add(s[right]) + + max_length = max(max_length, right - left + 1) + + return max_length +``` + +## dictを使った解法 +--- +時間計算量: O(N)
+空間計算量: O(N) + +(あまり旨みはない。indexが必要な時に便利か。) +```python +class Solution: + def lengthOfLongestSubstring(self, s: str) -> int: + left = 0 + letter_to_index = defaultdict(int) + max_length = 0 + + for right in range(len(s)): + while letter_to_index[s[right]] > 0: + letter_to_index[s[left]] -= 1 + left += 1 + + letter_to_index[s[right]] += 1 + max_length = max(max_length, right - left + 1) + + return max_length +``` From 97f9d79f8e6d6c2b9858c503074e0168fc41dcee Mon Sep 17 00:00:00 2001 From: mike <59136831+Mike0121@users.noreply.github.com> Date: Sat, 1 Jun 2024 17:25:22 +0900 Subject: [PATCH 2/2] Update 3. Longest Substring Without Repeating Characters.md --- ...Substring Without Repeating Characters.md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git "a/\347\253\266\346\212\200\343\203\227\343\203\255\345\260\261\346\264\273\351\203\250PR\347\224\250/3. Longest Substring Without Repeating Characters.md" "b/\347\253\266\346\212\200\343\203\227\343\203\255\345\260\261\346\264\273\351\203\250PR\347\224\250/3. Longest Substring Without Repeating Characters.md" index 5246f31..0420e9d 100644 --- "a/\347\253\266\346\212\200\343\203\227\343\203\255\345\260\261\346\264\273\351\203\250PR\347\224\250/3. Longest Substring Without Repeating Characters.md" +++ "b/\347\253\266\346\212\200\343\203\227\343\203\255\345\260\261\346\264\273\351\203\250PR\347\224\250/3. Longest Substring Without Repeating Characters.md" @@ -46,3 +46,24 @@ class Solution: return max_length ``` + +## dictを使った解法 (indexを記録) +--- +時間計算量: O(N)
+空間計算量: O(N) +```python +class Solution: + def lengthOfLongestSubstring(self, s: str) -> int: + left = 0 + letter_to_index = defaultdict(int) + max_length = 0 + + for right in range(len(s)): + if s[right] in letter_to_index and left <= letter_to_index[s[right]]: + left = letter_to_index[s[right]] + 1 + + letter_to_index[s[right]] = right + max_length = max(max_length, right - left + 1) + + return max_length +```