题3、 Longest Substring Without Repeating Characters

题3、 Longest Substring Without Repeating Characters

题目

Given a string, find the length of the longest substring without repeating characters.

Example 1:

Input: “abcabcbb”
Output: 3
Explanation: The answer is “abc”, with the length of 3.
Example 2:

Input: “bbbbb”
Output: 1
Explanation: The answer is “b”, with the length of 1.
Example 3:

Input: “pwwkew”
Output: 3
Explanation: The answer is “wke”, with the length of 3.
Note that the answer must be a substring, “pwke” is a subsequence and not a substring.

思路

这道题就是让大家找到一个字符串里面,最长的不重复子串,包括其本身。

一开始思路就是直接使用函数index()直接查询下一个相同字母的地方,然后直接相减得到最大值就是结果。不过好像是错的,有大佬闲着没事的话可以去试一试,反正笔者试了一下没成功(好像在误人子弟)。

之后发现还是得把字符串分不同的长度切割,然后一个一个判断,最后得到最终的结果,因为他是要得到最长的字符串长度,所以我就从最长的一个字符串开始(输入的哪一个字符串)依次递减。

需要注意的就是,这种方法对于不太长的字符串来说还可以,太长的电脑跑死也跑不出来,反正我跑了一个小时也没结果,输入也就3300个字符。之后就头秃时间复杂度的问题,最后灵机一动,字符串按道理一共也就128个(题目中具体有多少我不知道,反正我就按照ASCII码来了),这样一个不重复的字符串最大长度也就128,这就大大减少了循环的次数。

最后就是边界值和空格的问题,每特别机制的处理方式,直接试吧,动脑子太累了。

代码

这次想不开了,有注释了

public class T003 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		System.out.println( lengthOfLongestSubstring("asdasd") );
	}
	
    public static int lengthOfLongestSubstring(String s) {
    	
    	int sl = s.length();
    	int tl = 0;
    	
    	//如果字符串长度小于等于1,肯定不重复。直接返回结果0/1
    	if( sl <= 1 )
    		return sl;
    	
    	//第一个循环,i每加一,子串的长度就减少一,从零开始,也就是说子串的长度从s.length()开始
    	for( int i = 0; i<sl; i++ ) {
    		
    		//用来切割字符串S,得到子串,子串每减少1,那么切割得到的子串个数就加一
    		//其中对子串长度进行了限制,最大128也就是(sl>128 ? sl-127 : i+1)这一行代码
    		for( int j = 0; j < (sl>128 ? sl-127 : i+1); j++ ) {
    			
    			//切割,从而得到子串
    			String temp = s.substring( j, j+(sl>128 ? 128 : sl)-i );
    			//System.out.println( i + "\t" + temp );
    			tl = temp.length();
    			
    			//用来判断是不是要得到的子串
    			for( int k = 0; k<tl; k++ ) {
    				
    				//如果出现重复的就跳出循环
    				if( temp.indexOf(temp.charAt(k), k+1) != -1 )
    					break;
    				
    				//循环到了最后一次了,没问题,那可不就是咱要输出的
    				if( k == tl-1 ) {
    					//System.out.println("\n\n"+ temp + "\t" + sl );
    					return tl;
    				    
    				}
    			}
    		}
    	}
 		return 0;
   
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值