LeetCode-无重复字符的最长子串

本文介绍了一种求解字符串中无重复字符最长子串的高效算法,通过使用哈希映射来跟踪字符位置,实现了O(n)的时间复杂度。文章提供了一个具体的Java实现案例,并解释了解决方案背后的逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

示例:

给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。

给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。

给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串"pwke" 是 子序列  而不是子串。


解题思路:

这道题wa了挺久的挺尴尬的,考虑的场景不全,总是有漏子。

随便说一下思路吧,解题思路可以是双重遍历然后加map做判定存储,每次遍历clear一下 这样做也行,但是就是挺耗费性能的。

然后如果要在O(n)时间内完成,就要想一下啦。其实是不是可以这么想:

(1)对于遇到重复的字符串进行下判定,输出此时的子串的长度。

(2)但是还是得循环体内每次判定下,不然abcd等没有重复节点会有问题呢。

(3)这样做还是有问题呀,需要考虑下遇到abcdba这种情况。所以有了以下代码



class Solution {
    public int lengthOfLongestSubstring(String s) 
    {
    	int maxNum=0;
    	int indexStart=0;
    	int length =s.length();
    	Map<Character,Integer> map = new HashMap<>();
    	
    	for(int i=0;i<length;++i)
    	{
    		char c =s.charAt(i);
    		if(map.containsKey(c)&&map.get(c)>=indexStart)
    		{
    			indexStart =map.get(c)+1;
    		}
    		map.put(c, i);
    		maxNum=Math.max(maxNum, i-indexStart+1);
    		
    	}
  
    	
    	return maxNum;
        
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值