给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 "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;
}