3. Longest Substring Without Repeating Characters

题意:找到给定字符串中不包含重复字符的字串的最大长度

思路:不包含重复字符--->判断当前游标指向的字符是否在先前的字串中出现,即查找给定字符是否在某个字符串中(哈希表<字符,下标>,时间复杂度O(1),空间复杂度O(n));

   使用两个游标分别记录符合条件的字串的左右下标,便于求字串长度, 当被检查的字符在当前的子串中出现过时,当前子串终止继续增长,新字串从当前字符上次出现的下一个位置开始搜索。(哈希表在变化)

注意:任意字符,包括空字符

    public int lengthOfLongestSubstring(String s) {
        int max = 0;
        if(s == null || s.length() == 0){
        	return max;
        }
        HashMap
  
  
   
    map = new HashMap<>();
        int left, right;
        left = 0;
        map.put(s.charAt(0), left);
        max = 1;
        for(right = 1; right < s.length(); right++){
        	if(map.containsKey(s.charAt(right))){
        		int index = map.get(s.charAt(right));
        		if(max < (right - left))
        			max = right - left;
        		if(index >= left){ //子字串[left, right-1]中查找字符
        		    left = index + 1;
        		}
        	}
        	map.put(s.charAt(right), right); //添加没有的
   
   <字符,位序>
    
    ,更新之前相同字符的位序
        }
        if(max < (right - left)){
            max = right - left;
        }
        return max;
    }
   
   
  
  

 

      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值