给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
分析:
滑动窗口协议;
简单来说就是 当第 k 个字符对应无重复字符的结束位置为rk 的时候
那么当我们遍历第k+1个字符的时候,其结束的位置Rk+1 一定比Rk 要大,因为第k+1 与Rk 之间一定是不重复的,而且由于少了第k个字符,所以RK+1 就会比Rk 要大。所以
那么实现的思路就是 用一个HashSet 记录当前最长子串的内容,然后左边为索引i ,右边为Rk,
将Rk内容放入HashSet之前,先判断是否存在元素,如果不存在则右移Rk,如果存在则右移i,并且移除hashSet 中对应的i-1位置的元素
代码实现
import java.util.HashSet;
import java.util.Set;
public class TestController {
public static void main(String args[]) {
String example = "abcaddd";
System.out.println(lengthOfLongestSubstring(example));
}
public static int lengthOfLongestSubstring(String s) {
Set<Character> aloneItem = new HashSet<>();
int right = 0;
int n = s.length();
int ans = 0;
for (int left = 0; left < n; left++) {
if (left != 0) {
aloneItem.remove(s.charAt(left - 1));
}
while (right <= n-1 && !aloneItem.contains(s.charAt(right ))) {
aloneItem.add(s.charAt(right));
right++;
}
ans = Math.max(ans, right - left );
}
return ans;
}
}