这是力扣的一道题目,最开始尝试着用动态规划解决,可以是可以,但是看了题解之后觉得滑动窗口也是一个很妙的解题方法,学习了一下做了个小总结。
1.遍历字符串,并再定义一个指针,初始化该指针指在字符串的最左边
2.判断当前指针指向的字符是否在集合中出现过。
1)如果未出现,将该字符添加到集合中,并且让指针不停往下一个字符移动;
2)如果出现了,停止移动。
3.获取当前截止的字符串长度,并与上一个字符串进行比较。
流程示意:
从流程中可以很直观的看出最长的字串长度。
滑动窗口就好比队列,第一个进来的再找到重复的字符后就第一个离开,然后再循环判断。
class Solution {
public int lengthOfLongestSubstring(String s) {
Set<Character> set = new HashSet<>();
int index = 0;//定义右指针
int max = 0;
for(int i = 0;i < s.length();i++){
if(i!=0){
set.remove(s.charAt(i-1));
}
while(index < s.length()&&!set.contains(s.charAt(index))) {
set.add(s.charAt(index));
index++;
}
max = Math.max(max,index - i);
}
return max;
}
}