Leetcode3 Longest Substring Without Repeating Characters

本文介绍了一种解决LeetCode经典问题“寻找字符串中最长的无重复字符子串”的算法实现。通过使用ASCII码对应的数组来跟踪字符的出现情况及位置,实现了高效的遍历与判断过程。

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

我的leetcode代码已经放入github:https://github.com/gaohongbin/leetcode

题目:

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.

翻译:

给一个字符串,找到最长的没有重复字符的子串。

思路:

题目中给出的字符串都可以用ASCII码来表示,所以我们用一个数组exits[256]来表示字符串中哪些字符出现过。position[256]相应的用来表示字母的位置。max用来记录到上个字符串位置,最长的字符串的长度。start用来记录现在正在遍历的子串的起始位置。

当遍历到一个字母,这个字母在exits中出现过,那么现在查找的这个子串就停止,计算长度length,如果length>max, 则max=length;

如果length<=max,则不做处理。

如果字符串找到的字符在exits[i]中出现过,则下次开始遍历的子串位置从position[i]+1的位置开始。

当然这个题可以不用exits数组,直接用一个position数组就可以,刚开始吧position数组初始化为-1,当然不可能哪个字符的位置在-1,如果position中为-1,则代表相应的字符没有出现过。如果不为-1,则代表相应字符出现过。


代码:

public int lengthOfLongestSubstring(String s) {
        int length=s.length();
		if(length==0)
			return 0;
		int[] exits=new int[256];
		int[] position=new int[256];
		int start=0;
		int max=0;
		for(int i=0;i<256;i++){
			exits[i]=0;
			position[i]=-1;
		}
	        for(int i=0;i<length;i++){
	        	if(exits[(int)s.charAt(i)]==0){
	        		exits[(int)s.charAt(i)]=1;
	        		position[(int)s.charAt(i)]=i;
	        	}
	        	else{
	        		max=max>(i-start)?max:i-start;
	        		for(int j=0;j<256;j++){
	        			exits[j]=0;
	        		}
	        		start=position[(int)s.charAt(i)]+1;
	        		position[(int)s.charAt(i)]=i;
	        		i=start-1;
	        	}
	        	if(i==length-1){
	        		max=max>(i-start+1)?max:i-start+1;
	        	}
	        }
	        return max;
    }







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值