# 3-Longest Substring Without Repeating Characters
###### tags: `Medium`、`Sliding_window`
## Question:
https://leetcode.com/problems/longest-substring-without-repeating-characters/
## Key:
- 直觀想法(Brute force):先建一個list收集出現過的字母,如果遇到重複的就去除,但要記得保留沒重複的部分,並且計算一次長度
- Sliding window:用一個 set 來儲存目前 window 裡面有的 char,然後每次都要確定 window 裡已經沒有重複的 char,才會繼續擴張 window,先確定 windowEnd 的 char 不在 substring 中。假如最後面的指標所指的值在sliding window中已經出現過,就將最前面的指標移動到該值在sliding window 中的位址,並將set中的char刪除,否則最後面的指標就一直前進,並記錄和更新最大長度,直到字串尾巴。
## Sliding window Solution
### C++ version
```cpp=
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int n = s.length();
set<char> st;
int maxLen = 0, windowStart = 0, windowEnd = 0;
while(windowEnd < n) {
if(st.find(s[windowEnd]) == st.end())//if we don't find the char, we insert it to the set
{
st.insert(s[windowEnd]);
maxLen = max(maxLen, windowEnd-windowStart+1);
windowEnd++;
}
else {
st.erase(st.find(s[windowStart]));
windowStart++;
}
}
return maxLen;
}
};
```
### Python version
```python=
class Solution(object):
def lengthOfLongestSubstring(seld, s):
"""
:type s: str
:rtype: int
"""
if 5*10**4 > len(s) > 0:
alphas = []
cnts = []
cnt = 0
for i in range(len(s)):
if s[i] not in alphas:
alphas.append(s[i])
if i == len(s)-1:
cnt = len(alphas)
cnts.append(cnt)
else:
cnt = len(alphas)
cnts.append(cnt)
for a in range(len(alphas)):
if alphas[a] == s[i]:
alphas.append(s[i])
alphas = alphas[a+1:]
break
if len(cnts) == 0:
return 0
else:
return max(cnts)
else:
return 0
```
- 大神想法:
```python=
class Solution(object):
def lengthOfLongestSubstring(self, s):
answer = ''
result = 0
for i in s:
if i not in answer:
answer += i
else:
if len(answer) > result:
result = len(answer)
answer = answer[1:]
while i in answer:
answer = answer[1:]
answer += i
if len(answer) > result:
result = len(answer)
return result
```