3.无重复字符的最长子串

3.1 暴力求解

首先想到暴力法,找出所有子字符串,用哈希表逐个查看是否有相同元素。

public static int lengthOfLongestSubstring(String s) {

        int max=1;
        if(s==null||s.isEmpty()) return 0;
        HashSet<Character> set=new HashSet<>();

        for(int i=0;i<s.length();i++){
            
            for(int j=i;j<s.length();j++){
                flag=0;
                String sub=s.substring(i,j+1);//子串
                int a=0;
                for(a=0;a<sub.length();a++) {
           
                	if(!set.add(sub.charAt(a))){//无重复字符
                        
                    	break;
                	}
                   
                }
                if(a==sub.length()) {
                	max=max>(sub.length())?max:(sub.length());
                	
            	}
                set.clear();
                
            }
        }  
            
        return max;
    }

此方法时间复杂度为O(n^3),在题目最后一个用例测试时超时。

3.2 滑动窗口求解

        首先设置left和right两个滑动指针,都赋值为0。使用maxlength存储最大长度,curlength存储当前滑动窗口长度。使用HashSet来判断是否有相同元素。开始时,两个指针都在字符串首部。当不存在相同元素时,将right指针对应的元素存入set中,同时curlength当前长度加一,right指针后移一位,给maxlength赋值max(curlength,maxlength)。当遇到相同元素时,从set中移除left指针所指元素,然后left指针后移,且curlength减一,循环操作,直到没有相同元素,此时就可以将right指针所指元素放入set,同时不要忘记后移right指针,并且curlength加一。当right指针到达字符串末尾时,循环结束。

class Solution {
    public int lengthOfLongestSubstring(String s) {

        int maxlength=0;
        int curlength=0;
        int left=0;
        int right=0;
        HashSet<Character> set = new HashSet<>();
        while(right<s.length()){
            if(!set.contains(s.charAt(right))){
                set.add(s.charAt(right));
                curlength++;
                right++;
                maxlength=maxlength>curlength?maxlength:curlength;
            }else{
                while(set.contains(s.charAt(right))){
                    set.remove(s.charAt(left));
                    left++;
                    curlength--;
                }
                set.add(s.charAt(right));
                curlength++;
                right++;
                
            }
        }
            
        return maxlength;
    }
}

测试通过。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值