一、题目: 无重复字符的最长子串
二、题目解析:
题目解析:示例1和2表明最长子串不能重复,示例3表明必须要连续,可以利用滑动窗口的思想,定义两个指针i,j和一个set,一个指针i不断往前遍历,判断set中是否有当前值,有移动j,并移除set中的元素,直到集合中不包含当前元素,添加到set中,直到循环遍历结束。
解题步骤:
- 创建一个set
- 两个指针,第一个指向字符串的开头 -j,第二个随着for循环遍历字符串 -i,
- 如果set里没有s[i],说明目前为止还没有重复的字符,把s[i]添加到set里,然后更新最大不重复字符的数量
- 如果set里有s[i],则从set里开始删除s[j],并且递增j,再检查set里没有s[i]为止。
- 重复步骤3和4,直到遍历完整个字符串
图解:
三、代码如下:
无重复字符的最长子串:
public int lengthOfLongestSubstring(String s) {
HashSet<Character> set = new HashSet<>(); //用来保证子串不重复
int j = 0, maxLength = 0;
if (s == null || s.length() == 0) {
return 0;
}
for (int i = 0; i < s.length(); i++) {
if (!set.contains(s.charAt(i))) { //set中没有则添加,同时记录最长子串
set.add(s.charAt(i));
maxLength = Math.max(maxLength, set.size());
} else {
//出现重复元素时遍历j指针同时删除set集合元素,直到不重复为止
while (set.contains(s.charAt(i))) {
set.remove(s.charAt(j));
j++;
}
set.add(s.charAt(i));
}
}
return maxLength;
}
四、测试
数据 abcabcbb
数据 pwwkew
五、结束