3.无重复最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
思路:看完题目就觉得用双端队列来实现挺好。求最长无重复子串,如果按照“求所有子串–>从所有子串中选出最长无重复子串”这个思路,显然需要搜索的解空间太大。但如果采用双端队列,每次只针对当前处理的无重复子串长度来更新无重复子串的最大值,这样就快很多。
双端队列的优势在于,可以从前后两个方向操作元素。因此在本题中,采用双端队列存储当前处理的无重复子串,用max存储所有已处理过的无重复子串的最大值:
- 如果当前元素存在于双端队列中,此时当前的无重复子串长度达到最大值,更新max,并且从队头位置开始删除队列元素,直到最后一个和当前元素相同的元素。将当前元素插入到双端队列尾部。
- 如果当前元素不存在于双端队列中,则将该元素插入到双端队列尾部,更新max。
具体代码如下:
//无重复最长子串
public int lengthOfLongestSubstring(String s) {
int max = 0;
//使用双端队列来维持当前无重复的子串
LinkedList<Character> queue = new LinkedList<>();
for(char c : s.toCharArray()){
if(queue.contains(c)){
//当前重复子串达到最大状态
max = queue.size()>max?queue.size():max;
//更新双端队列->删除c之前(包括c)的元素
//確定隊列中最後一個c的位置
while(queue.contains(c)){
queue.removeFirst();
}
}
queue.addLast(c);
max = queue.size()>max?queue.size():max;;
}
return max;
}