leetcode刷题笔记(7)

3. 无重复字符的最长子串 - 力扣(LeetCode)

问题描述:

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

解题思路:

使用哈希表解决确定子串是否有重复字符问题,在尽量短的不重复子串中找到不重复子串的最小长度,使用哈希表模拟队列,双指针表示队列两端,队尾进元素,队头出元素。

入队时需要将队列中重复的元素从队头不断弹出,保证队列中没有重复字符,然后在完成一次队尾元素入队后,更新最短子串的长度记录。

代码如下:

class Solution {//采用类似长度最小子数组的方式处理
    //找尽量短的不重复的子串的最短长度
    public int lengthOfLongestSubstring(String s) {
        //用有序集合
        HashMap<Integer,Character> hashMap=new HashMap<>();
        //队列加法
        int i=0,j=0;
        int maxSubLength=0;
        while(j<=s.length()-1){//j为待入队列的元素,不能越界,i永远会小于等于j
            while(hashMap.containsValue(s.charAt(j))){
                hashMap.remove(i++);//队头出
            }
            hashMap.put(j,s.charAt(j++));//队尾入
            //这样保证子串无重复字符
            maxSubLength=Math.max(maxSubLength,j-i);//左闭右开区间
        }
        return maxSubLength;
    }
}

这道题时间和内存空间应该还是有优化空间的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值