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 + 1not 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;
    }
}

 

posted @ 2019-07-08 17:44  oldby  阅读(317)  评论(0编辑  收藏  举报