【Leetcode解題】3. Longest Substring Without Repeating Characters
題目
- 題目連結
- 目標函式 :
lengthOfLongestSubstring(s)- Input :
s: str - Output :
int
- Input :
解題概念
- 題意 : 給定一字串
s,需要回傳最長 Substring 的長度(不包含重複字元)
我的寫法
- 想法 :
max_value: 儲存目前累積的最長長度temp_str: 暫存每回合的 Substring- 使用 for 迴圈去判斷每個字元
c:- 若
c已出現在temp_str中 : 代表出現重複字元- 更新當前
max_value - 將
temp_str當中索引值為0~temp_str.index(c)]移除
- 更新當前
- 再將
c加到temp_str後方
- 若
- 最後回傳
max(max_value, len(temp_str))
- 程式碼 :
1
2
3
4
5
6
7
8
9
10
11
12def lengthOfLongestSubstring(self, s):
if len(s) == 0: return 0
max_value = -1
temp_str = ""
for c in s:
if c in temp_str:
max_value = max(max_value, len(temp_str))
temp_str = temp_str[temp_str.index(c)+1:]
temp_str += c
return max(max_value, len(temp_str)) - 成效 :
- Time Complexity : $O(n)$
- Runtime: 33 ms (faster than 81.46%)
- Memory Usage: 13.5 MB (more than 85.14%)
解答 or 其他優秀寫法
- 想法 : 使用 Hashmap
seen去儲存已看過的字元- 儲存格式 :
key: 已看過的字元value: 該字元位於s的索引值
- 使用參數 :
left: 當作是temp_str第一個字元的索引值
- 使用 for 迴圈去判斷每個字元
s[right]:- 若
s[right]已被看過 +left <= seen[s[right]](即temp_str為空) :- 則更新
left: 將其設為seen[s[right]] + 1
- 則更新
- 否則,更新
max_value即可
- 若
- 最後將
seen中s[right]的 value 設為right
- 儲存格式 :
- 程式碼 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17def lengthOfLongestSubstring(self, s):
if len(s) == 0: return 0
seen = dict()
left = 0
max_value = 0
for right in range(len(s)):
if s[right] in seen and left <= seen[s[right]]:
left = seen[s[right]] + 1
else:
max_value = max(max_value, right - left + 1)
seen[s[right]] = right
return max_value - 成效 :
- Time Complexity : $O(n)$
- Runtime: 35 ms (faster than 76.43%)
- Memory Usage: 14.2 MB (more than 42.81%)
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Robin's Tech Blog!


