leetcood学习笔记-3-无重复字符的最长子串
题目描述:
方法一:O(N)
class Solution: def lengthOfLongestSubstring(self, s: str) -> int: slow = 0 fast = 0 res_max = 0 table = dict() while slow<len(s) and fast<len(s): if s[fast] in table: del(table[s[slow]]) slow+=1 else: table[s[fast]] = fast fast+=1 res_max = max(res_max,fast-slow) return res_max
优化:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
occ = set()
n = len(s)
rk,ans = -1 ,0
for i in range(n):
if i != 0:
occ.remove(s[i-1])
while rk + 1 < n and s[rk + 1] not in occ:
occ.add(s[rk + 1])
rk += 1
ans = max(ans,rk - i + 1)
return ans
java:
class Solution { public int lengthOfLongestSubstring(String s) { int ans = 0; Set occ = new HashSet(); int n = s.length(); int rk = -1; for(int i = 0;i < n; i++){ if(i != 0){ occ.remove(s.charAt(i - 1)); } while(rk+1 < n && !occ.contains(s.charAt(rk + 1))){ occ.add(s.charAt(rk + 1)); ++rk; } ans = Math.max(ans,rk -i + 1); } return ans; } }