双指针
算法思路
- 思路回忆:子串一般解法就是双指针/滑动窗口,即使用左右指针分别指向子串在原串中的位置,通过右指针触发条件,修改左指针,直至右指针无法移动。特殊边界案例特殊考虑
- 由此,代码模板如下:
class Solution {
// 考虑使用双指针,或者双端队列的形式,保证队列内元素不重复,用hashset可以保存不重复子串
int maxLength = Integer.MIN_VALUE;
public int lengthOfLongestSubstring(String s) {
int len = s.length();
HashSet<Character> occ = new HashSet<>();
if(len<=1){
return len;
}
int left = 0,right=1;
occ.add(s.charAt(left));
while(right<len){
while(occ.contains(s.charAt(right))){
occ.remove(s.charAt(left));
left++;
}
occ.add(s.charAt(right));
right++;
maxLength = Math.max(occ.size(),maxLength);
}
return maxLength;
}
}
此处回忆HashSet
HashSet是uitl包下的实体类,继承AbstractSet,实现Set、Cloneable、Serializable接口。
HashSet基于HashMap实现,保存不重复元素。允许有null值,内部无序,线程不安全。
常见的方法有
- add():添加元素
- contains():判断元素是否存在
- remove():删除元素
- size(): 计算大小