leetcode第3题,无重复字符的最长子串,java实现

题目链接

运行结果

执行结果:通过
执行用时 :9 ms, 在所有 java 提交中击败了80.56%的用户
内存消耗 :37.4 MB, 在所有 java 提交中击败了92.70%的用户

代码实现

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int res = 0;
        // 新建hashmap
        Map<Character, Integer> map = new HashMap<>();
        // 遍历字符串
        for (int start = 0, end = 0; end < s.length(); end++)
        {
            char ch = s.charAt(end); // 读取单个字符
            // 如果字符重复
            if (map.containsKey(ch))
            {
                // 将start指向修改为出现重复字符的后一位,max的作用是防止start左移
                start = Math.max(map.get(ch), start);
            }
            // hash表中存储的值为索引+1
            map.put(ch, end + 1);
            // 计算出现子串的最大长度            
            res = Math.max(end - start + 1, res);
        }
        return res;
        
    }
}

做题心得
1.用hash表实现高效的查询,时间复杂度为O(1),hash表的主存储结构是数组,结合链表和红黑树解决哈希冲突问题;
2.采用滑动窗口法,n长度的字符串,只遍历一次,时间复杂度为O(n)。
3.需要注意,当有重复字符出现时,start的指向需要修改为,map中出现相同字符位置的后一位。这点通过存储end + 1,已经实现。
4.start赋值采用max函数,防止start左移。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值