leetcode 第三题

本文介绍了LeetCode第三题的解决方案,即寻找字符串中不包含重复字符的最长子串的长度。通过使用HashMap记录字符及其索引,并结合滑动窗口思想,动态更新最大子串长度。时间复杂度为O(n)。

leetcode第三题

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

示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

示例 2:
输入: s = “”
输出: 0

思路:利用HashMap来存储字符串中的每个字符(键)和其对应的索引(值),由于键是唯一的,使用put()方法会更新该字符的索引。利用滑动窗口的思想,假设有两个指针,右指针对字符串进行遍历,每当检测到有相同的字符时,让左指针移动到该字符之前索引(值)的后一位,这样保证了两个指针之间的字符串中没有相同的字符。每次左指针移动或右指针遍历完成,更新当前最大的长度值。

class Solution {
        public static int lengthOfLongestSubstring(String s) {
        //字符串为空时,直接返回0
            if(s.length() == 0)
                return 0;

            Map<Character,Integer> map = new HashMap<>();
            //模拟左指针
            int left = 0;
            int len = 0;
            //模拟右指针
            int right = 0;

            for (;right <s.length();right++) {
                char ch = s.charAt(right);
                if(map.containsKey(ch)){
                	//更新当前最大的长度值
                    len = Math.max(len,right-left);
                    //取较大值,否则可能出现左指针后退的情况
                    left = Math.max(left,map.get(ch)+1);
                }
                //put方法会直接更新每个字符(键)的最新索引(值),键是唯一的
                map.put(ch,right);
            }
            //遍历完成后更新最大长度值
            return len>right-left?len:right-left;
        }

    }

时间复杂度:O(n)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值