前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >力扣3-无重复字符的最长子串

力扣3-无重复字符的最长子串

原创
作者头像
后端码匠
修改2021-08-18 14:23:18
2320
修改2021-08-18 14:23:18
举报
文章被收录于专栏:后端码匠

暴力求解

复杂度分析

时间复杂度O(n^2)

空间复杂度O(m)

代码语言:txt
复制
class Solution {
    public int lengthOfLongestSubstring(String s) {
        int res = 0;
        for(int i = 0; i < s.length(); i++) {
            Set<Character> set = new HashSet<>();
            for(int j = i; j < s.length(); j++) {
                if(set.contains(s.charAt(j))) break;
                res = Math.max(res, j - i + 1);
                set.add(s.charAt(j));
            }
        }
        return res;
    }
}

滑动窗口

复杂度分析

时间复杂度O(n)

空间复杂度O(m)

代码语言:txt
复制
class Solution {
    public int lengthOfLongestSubstring(String s) {
        Set<Character> set = new HashSet<>();
        int right = -1, ans = 0;
        for(int i = 0; i < s.length(); i++) {
            if(i != 0) set.remove(s.charAt(i - 1));
            while(right + 1 < s.length() && !set.contains(s.charAt(right + 1))) {
                set.add(s.charAt(right + 1));
                ++right;
            }

            ans = Math.max(ans, right - i + 1);

        }

        return ans;
    }
}
代码语言:txt
复制
class Solution {
    public int lengthOfLongestSubstring(String s) {
        if(s.equals("")) return 0;
        int start = 0, end = 0;
        int max = 1;
        HashSet<Character> set = new HashSet<>();
        while(end < s.length()) {
            char c_e = s.charAt(end);
            if(set.contains(c_e)) {
                set.remove(s.charAt(start));
                start++;
            } else {
                set.add(c_e);
                end++;
                max = Math.max(max, set.size());
            }
        }
        return max;
    }
}
代码语言:txt
复制
    public int lengthOfLongestSubstring(String s) {
        int length = s.length();
        if (length < 2) return length;

        //双指针,将遇到的字符放进Map,看是不是重复的。
        Map<Character, Integer> map = new HashMap<>();
        char[] array = s.toCharArray();
        int size = 0;

        //窗口左指针
        int left = 0;

        for (int right = 0; right < length; right++) {
            //i是右指针
            if (map.containsKey(array[right])) {
                //如果包含了此元素,说明重复,需要移动左指针
                //窗口不能回退。
                left = Math.max(map.get(array[right]) + 1, left);
            }
            //修改当前元素索引
            map.put(array[right], right);
            //计算长度
            size = Math.max(size, right - left + 1);
        }
        return size;
    }

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 暴力求解
    • 复杂度分析
    • 滑动窗口
      • 复杂度分析
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档