力扣:016无重复字符的最长子串

题目

给定一个字符串s,请找出其中不含重复子串的最长连续子字符串的长度

思路

使用滑动模块来实现最长的子串的记录实现,使用一个set来记录滑块中间存在的元素,实现滑块的移动判断,使用循环将数据进行遍历之后将滑块进行滑动,进过一个数组的长度的移动之后,中间使用ans来记录最长的长度最后直接返回ans就实现了题目的要求

代码java

class Solution {
    public int lengthOfLongestSubstring(String s) {
        Set<Character> set = new HashSet<Character>();
        char[] c = s.toCharArray();
        int left = 0;
        int ans = 0;
        for(int i = 0; i < c.length; i++){
            //存在元素,滑动
            if(set.contains(c[i])){
                while(set.contains(c[i])){
                    //如果还存在窗口就将滑块进行移动
                    //返回移动之后的滑块实现滑动
                    set.remove(c[left]);
                    left++;
                }
            }
            //不存在元素之后添加
            set.add(c[i]);
            ans = Math.max(ans, i - left + 1);
        } 
        return ans;
    }
}

复杂度分析

循环遍历的数据的长度即时间复杂度是O(n)的,但是最坏情况下就是O(n)的复杂度了,就是数据里面是交替出现的数据,内层的while循环也是O(n)的所以最坏时间复杂度就是O(n^2)的了,使用hashSet一般会被认为是O(1)的。空间复杂度就是所有的元素就是O(n)的了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值