无重复字符的最长子串

给定一个字符串,找出不含有重复字符的最长子串的长度。

示例:

给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。

给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。

给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串"pwke" 是 子序列  而不是子串。

解题思路:

从第一个字符开始往后遍历,如果下一个字符和当前哈希表中的字符没有重复部分,则添加进子串,否则,清空哈希表并从第二个字符开始往后遍历,如此循环。

为此需要定义两个指针,分别表示字符子串的起始位置和结束位置。

    public static int lengthOfLongestSubstring(String s) {
//    	System.out.println(s);
    	int length = s.length();
    	//len表示字符串长度的最大值
    	int len = 0;
    	//把字符串切分成字符
    	char[] str = s.toCharArray();
        //哈希表的作用是存储字符
    	HashSet<Character> hashset = new HashSet<Character>();
		//思路:从第一个字符开始往后遍历,如果下一个字符和当前哈希表中的字符没有重复部分,则添加进子串,否则,清空哈希表并从第二个字符开始往后遍历,如此循环
    	//指针i,j分别表示字符串的左边和右边(也就是窗口的左侧和右侧)
    	int i=0,j=0;
    	while(i < length && j < length){
//    		System.out.println("从第"+(i+1)+"个字符开始遍历:");
    		//如果下一个字符不重复,那么将其添加到哈希表中,并将j往右移动
    		if(!hashset.contains(str[j])){
//    			System.out.println("不重复");
    			hashset.add(str[j]);
    			//len取  当前值  和  之前循环中出现的最大值  之中的最大值
    			len = Math.max(len, j-i+1);
    			j++;
    		}
    		//如果下一个字符重复,那么就舍弃这个哈希表,并且跳出该次循环,从第二个字符开始再次遍历
    		else{
//    			System.out.println("重复");
    			hashset.removeAll(hashset);
    			i++;
    			j=i;
    		}
    		//每次循环输出看一下
//    		System.out.println(hashset.toString());
    	}
    	return len;
    }

猜你喜欢

转载自blog.csdn.net/superstar987/article/details/80500204
今日推荐