给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2:
输入: “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。 示例 3:
输入: “pwwkew” 输出: 3 解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
解题思路:
利用set集合元素不重复的特性,定义两个指针记录当前子串的首位位置,如果发生字符重复则删减子串的长度实时更新。
代码如下:
public static int lengthOfLongestSubstring(String s) {
if (s==null||s.length()==0) return 0;//如果字符串为空或者字符串长度等于0,直接返回0
int maxL = 1;//定义最长不相交子串长度为1
HashSet<Character> characters = new HashSet<>();
int start = 0;//定义当前不重复字符串初始索引
int next = 1;//定义当前字符索引
characters.add(s.charAt(start));
while (next<s.length()){
if (!characters.contains(s.charAt(next))){//如果字符串已经不包含该字符,将该字符加入到集合
characters.add(s.charAt(next));
maxL = Math.max(maxL,characters.size());//更新最长不相交子串长度
next++;
}else {
//将相同字符以及相同字符之前的字符删除掉,每删除一个,指针向后挪一位
while (s.charAt(start)!=s.charAt(next)){
characters.remove(s.charAt(start));
start++;
}
if (s.charAt(start)==s.charAt(next)){
characters.remove(s.charAt(start));
start++;
}
characters.add(s.charAt(next));//将当前指针加入集合
next++;//
}
}
return maxL;
}