第3题:无重复字符的最长子串

解题思路

3. 无重复字符的最长子串
先来说下解题经历:
开始考虑得太片面,出错了好多次,每出错一次,然后根据系统给出的出错的示例进行修正,总的来说,就是经过一次又一次的失败,从每次失败中吸取经验,最终完成了,代码有点混乱,算法有点粗糙,因为是经过反复修改才写出来的,还没来得及优化,想着先来记录下感想与经历。哈哈0.0.
思路简单大概性的描述:使用滑动窗口
用二个int变量来标记字符串中字符移动的位置,begin起始为0,变量i不断前移,当碰到和已经遍历过的字符相同的字符,那么就计算出现在子串的长度(即i-begin),然后把begin移动到已经遍历过的相同字符的前面一位(即遇到重复的元素,将左边界begin更新为 重复元素的下一个位置)。然后遍历i继续前移。

说明:

大概思路就是这样,但是细节怎么处理真的很重要,我自己细节处理得很糟糕,代码很混乱,但大体思路流程没错,方向就不会偏,慢慢根据错误修改总会做对,后续就是代码的整理优化了!!!

代码

优化前:
class Solution {
    public static int lengthOfLongestSubstring(String s) {
		   int length = 0;
		   int result_length = 0;
		   int begin = 0;
		   int last_begin = 0;
           Map<Character , Integer> map = new HashMap<>();
           for(int i=0 ; i<s.length() ; i++) {
        	    last_begin = begin;
        	    char curr_c = s.charAt(i);
        	    if(map.containsKey(curr_c)) {
        	    	length = i-begin;
        	    	begin = map.get(curr_c)+1;
        	    	result_length = Math.max(result_length, length);
        	    	for(int k=last_begin ; k<begin ; k++) {  //删除map中重复字符以及其前面的字符
        	    		 map.remove(s.charAt(k));
        	    	}
        	    	map.put(curr_c,i);
        	    	length = map.size();
        	    }else {
        	    	map.put(curr_c,i);
        	    	length++;
        	    }
           }
           result_length = Math.max(result_length, length); 
           return result_length;
    }
}
优化后:
class Solution {
    	public static int lengthOfLongestSubstring(String s) {
		Map<Character,Integer> map = new HashMap<>();
		int left = 0;
		int result = 0;
		for(int right=0 ; right<s.length() ; right++) {
			char curr_c = s.charAt(right);
			if(map.containsKey(curr_c)) {
				left = Math.max(left, map.get(curr_c)+1); //取两者之中的最大值是防止左边界left向左移动。
			}
			map.put(curr_c , right);
			result = Math.max(result , right-left+1);
		}
		return result;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值