LeetCode OJ 3.求字符串中最长不重复子串长度问题

3 篇文章 0 订阅
3 篇文章 0 订阅
题目描述:给定一个字符串,求出这个字符串中最大长度的字段,返回长度public class LongSubString{ public int lengthOfSubString(String s){ //首先把字符串转化成字符数组 char[] arr = s.toCharArray(); //start:开始位置 cur:实时长度;max:最大长度 int start
摘要由CSDN通过智能技术生成

题目描述:

给定一个字符串,求出这个字符串中无重复字符的最长子串,返回长度

分析:

首先这道题不得不说出的很不错,说实话,这个代码不是自己写的,我也就写一下自己的看法吧

从“a-z”在从“A-Z”这些个元素,我们给这些个字符都分配一个格子,也就是数组,因为每一个字符都对应一个ASCII码,

这也就是为什么定义一个长度为125大小数组原因了,比如z的ASCII码是122,所以当z第一次出现的时候,我们给第

122个位置打标记,标记的信息为z在数组中的位置并且在加1,等到下次再出现z的时候,问题出现了,z之前的字符

可以作为一段,同时我们已经记录了最长字段的长度,这时,我们就需要把第二个z之前的子段标记全部初始化,也

就是置0。

或许大家看到这里有点不懂了,那就再看一遍吧,好好理解一下

————————————————————————————————————————————————————

然后看懂了上面的分析(一定要看懂),在分析开始和结束位置的定义,大家可以想一想,前面出现一个重复的元素,那

么end的值就是重复元素的上一个位置了,所以end = map[c]-1,这个很关键,为什么是map[c]-1呢,因为map[c]存放着上着

相同的元素的位置信息,打个比方啊

"a b c d g h c i k l"当遍历到第2个c的时候,map[c]已经不等于0了,map[c]里是什么东西呢,前面已经提过,位置信息+1,

第二次寻找就需要从d开始,也就是第4个位置(第一个c的位置+1)开始,所以start=map[c]-1+1;之后,要对原来的字符

进行标记,而且不要忘记此时的长度已经变化,cur = i-end;

说了这么多,希望大家能够明白,谢谢大家提出宝贵意见


	public int lengthOfSubString(String s){
		char[] arr = s.toCharArray();//将String转化为Char型数组
		int start = 0, cur = 0, max = 0;
		int[] map = new int[125];//为每个字母定义一个位置,记录每一个字符的信息
		for(int i=0;i<arr.length;i++){
			char c = arr[i];//
			if(map[c]==0){
			        map[c] = i+1;//标记,重要!!!!!!!!!!!!
				cur ++;//此时的长度增1
				if(cur > max){
					max = cur;//检查长度是否超过最大值
				}
			}else{
				end = map[c] -1;//如果出现重复的字符,则提取上个出现该字符的位置
				for(int j=start;j<end;j++ ){//将这个区间上的所有位置信息初始化,也就是置0
					map[char[i]] = 0;
				}
				start = end + 1;
				map[arr[i]] = i+1;
				cur = i-end;
			}
		} 
		return max;
	}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值