无重复字符的最长子串

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
样例输入:

"abcabcbb"
"bbbbb"
"pwwkew"
"ohvhjdml"
"dvdf"
"aab"

样例输出:

3
1
3
6
3
2

方法一:
暴力破解,通过循环,所有长度为1的字串,依次判断是否元素重复(显然没有),所有长度为2的所有子串,依次判断是否元素重复,所有长度为3.字串。。。

class Solution {
    public int lengthOfLongestSubstring(String s) {
    	int maxLength = 0;
    	for(int i =0 ;i<s.length();i++) {
    		 for(int j = 0;j<s.length()-i;j++) {
    			String sub = s.substring(j, j+1+i);
    			Set <Character> set = new HashSet<Character>();
    			for(int m = 0;m<sub.length();m++) {
    				set.add(new Character(sub.charAt(m)));
    				}
    			if(set.size()!=sub.length()) continue;
    			maxLength = Math.max(sub.length(), maxLength);
    		}
    	}
    	return maxLength;
    }
}

方法二:
滑动窗口
例如将字符串ohvhjdml,从头o开始放入队列,每次放入前判断是否存在重复元素。
直至当队列中有了ohv时,再次放入下一个元素h时,判断到有重复元素,去掉o;
此时队列为hv,再次放h,又判断到重复元素,移去了头元素h;
此时队列中有v,再次放h,放入成功…
就有点像一个窗口在字符串ohvhjdml上从左滑动,当碰到有重复元素时就一直移除头部元素,直到元素不重复就继续往后滑。

class Solution {
	public int lengthOfLongestSubstring(String s) {
		Queue<Character> que = new LinkedList<Character>();
		int maxLength = 0;
		for(int i = 0 ;i<s.length();i++) {
			while(que.contains(new Character(s.charAt(i)))) {
				que.poll();
			}
			que.offer(s.charAt(i));
			maxLength = Math.max(maxLength, que.size());
		}
		return maxLength;
	}
}

posted on 2019-07-11 21:51  107国道道长  阅读(74)  评论(0编辑  收藏  举报

导航