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