求java无重复的最长子串


<pre name="code" class="java">public static List getNoRepeatString(String str)
	   {
		   //存放可能多个的最长子串
		   List<String> longlists=new ArrayList<String>();
		   //存放无重复字符所在的最后位置
		   HashMap<Object, Object> map=new HashMap<Object, Object>();
		   //开始位置
		   int start=0;
		   //最大长度
		   int maxlen=0;
		   int pre=0;
		   int i;
		   
		   //一次遍历字符串
		   for(i=0;i<str.length();i++)
		   {
			   //如果map中包含这个字符
			   if(map.containsKey(str.charAt(i)))
			   {
				   //当前子串的长度
				   int nowlen=i-start;
				   //子串存在map中的次最新的位置
				   pre=(int) map.get(str.charAt(i));
				   //找到了最新的串,>=是为了解决多个相等的最长子串问题,比如"abab"
				   if(nowlen>=maxlen)
				   {
					   //这是为了在有最长子串的情况下,清除之前存的子串,比如"ababc"
					   if(nowlen>maxlen)
					   {
						   longlists.clear();
					   }
					   //设置最长子串和其长度
					   maxlen=nowlen;
					   longlists.add(str.substring(start,i));
				   }
				   //只要包含重复的字符,就更新map中的最新位置
				   //将起始位置设置为重复字符第一次出现位置的后一个位置
				   start=pre+1;
				   map.put(str.charAt(i), i);
			   }
			   else
			   {
				   //不包含之间放进map中标记最新位置
				   map.put(str.charAt(i), i);
			   }
		   }
		   //是为了解决从来不包含重复字符的情况
		   if(i-start>=maxlen)
		   {
			   if(i-start>maxlen)
			   {
				   longlists.clear();
			   }
			   longlists.add(str.substring(start,i));
		   }
		   return longlists;
	   }



                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值