Longest Substring Without Repeating Characters

String.toCharArray()的速度是String.split("")的5倍。

自己写的算法,第一次竟然花了2千多ms,主要是用了split,速度太慢了。

改了之后,速度到了600多ms,还是很差

public int lengthOfLongestSubstring(String s) {
		if(s==(""))return 0;
		if(s.length()==1)return 1;
		//将String换成Character
        List<Character> list=new ArrayList<Character>();
        char[] strs=s.toCharArray();
        list.add(strs[0]);
        int max=0;
        int tmax=0;
        for(int i=1;i<strs.length;i++){
        	if(!list.contains(strs[i])){
        		list.add(strs[i]);
        		tmax=list.size();
        		if(tmax>max)max=tmax;
        	}
        	else{
        		int temp=list.size();
        		if(temp>max)max=temp;
        		int a=list.indexOf(strs[i]);
        		//System.out.println(a);
        		//撤回到重复的位置
        		i=i-(temp-a)+1;
        		//如果后面要匹配的元素还没有当前最大元素大,就直接返回
        		if((strs.length-i+1)<max)return max; 
        		list.clear();
        		list.add(strs[i]);
        		
        	}
        }
        return max;
    }
第二种方法:速度提高了很多,到了大约60ms,主要是减少了重复的操作,而且用到了HashSet,搜索很快。

public int lengthOfLongestSubstring3(String s) {
	    if(s==null || s.length()==0)
	        return 0;
	 
	    HashSet<Character> set = new HashSet<Character>();
	 
	    int max=0;
	 
	    int i=0;
	    int start=0;
	    while(i<s.length()){
	        char c = s.charAt(i);
	        if(!set.contains(c)){
	            set.add(c);
	        }else{
	            max = Math.max(max, set.size());
	 
	            while(start<i&&s.charAt(start)!=c){
	                set.remove(s.charAt(start));
	                start++;
	            }
	            start++;
	        }
	 
	        i++;
	    }
	 
	    max = Math.max(max, set.size());
	 
	    return max;
	}
第三种方法,速度最快,只需要7ms左右,非常快

public int lengthOfLongestSubstring2(String s) {
        if(s==null)
            return 0;
	boolean[] flag = new boolean[256];//字符的ASCII码,常用的是128个,扩展加了128个,所以一共有256个。使用这个标记就变得非常快了
 <span style="white-space:pre">	</span>//计算机处理问题就是用0和1来进行的,所以,使用true和false非常符合计算机的处理特点,很快
	int result = 0;
	int start = 0;
	char[] arr = s.toCharArray();
 
	for (int i = 0; i < arr.length; i++) {
		char current = arr[i];//当前位置
		if (flag[current]) {
			result = Math.max(result, i - start);
			// the loop update the new start point
			// and reset flag array
			// for example, abccab, when it comes to 2nd c,
			// it update start from 0 to 3, reset flag for a,b
			for (int k = start; k < i; k++) {
				if (arr[k] == current) {
					start = k + 1; 
					break;
				}
				flag[arr[k]] = false;
			}
		} else {
			flag[current] = true;
		}
	}
 
	result = Math.max(arr.length - start, result);
 
	return result;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值