【LeetCode】003 无重复的最长子串(Java版)

题目描述

  • 给定一个字符串,找出不含有重复字符的最长子串的长度。
    示例 1:  
    	输入: "abcabcbb"   
    	输出: 3   
    	解释: 无重复字符的最长子串是 "abc",其长度为 3。
	
	示例 2:  
		输入: "bbbbb"  
		输出: 1.     
		解释: 无重复字符的最长子串是 "b",其长度为 1。
	
	示例 3:    
		输入: "pwwkew"  
		输出: 3  
		解释: 无重复字符的最长子串是 "wke",其长度为 3。    
		请注意,答案必须是一个子串,"pwke" 是一个子序列 而不是子串。

难度系数:中等

思路解析

  1. 暴力破解(时间复杂度O(n^2),在此不举例)
  2. 分别用两个指针 i,j,通过使用HashSet来检查字符是否重复的时间复杂度为O(1),时间复杂度O(n)。

流程

① 创建一个HashSet来保存当前字符串的字符
② i 和 j 两个索引表示当前子串,从0、0开始, i 和 j 表示的都是第一个字符
③ 把索引 j 逐个向右扫描,并检查索引 j 位置的字符是否在set中
④ 如果索引 j 位置的字符不在set中,则将索引 j 位置的字符加入set
⑤ 查看并比较当前子串长度
⑥ 继续将 j 索引向右
⑦ 如果索引 j 位置的字符在set中,则将索引 i 位置的字符移出set
⑧ 并将索引 i 向右移动(如果索引 j 位置的字符仍然在set中,则继续执行⑦⑧)
在这里插入图片描述

  • 图片来源:wx公众号@五分钟学算法。

代码

/**
     * 无重复字符的最长字串
     * @param s
     * @return
     */
 public int longestString(String s){
        /**思路:遍历string每个char[],    **/
        int n = s.length();
        Set<Character> set = new HashSet<>();
        int ans = 0, i = 0, j = 0;
        while (i < n && j < n) {
            if (!set.contains(s.charAt(j))) {
                set.add(s.charAt(j));
                ans = Math.max(ans, j - i + 1);
                j++;
            } else {
                set.remove(s.charAt(i));
                i++;
            }
        }
        return ans;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值