剑指 Offer 48. 最长不含重复字符的子字符串

题目:

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

 

示例 1:

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

 

提示:

  • s.length <= 40000

代码:

 1 import java.util.Iterator;
 2 import java.util.LinkedList;
 3 import java.util.List;
 4 
 5 //与滑动窗口相似,利用集合实现窗口,集合大小就是窗口大小,滑动窗口更高效利用,利用双指针(快慢指针)实现
 6 //窗口没有集合的删除操作,不过需要对每个元素进行判断是否重复
 7 class Solution {
 8     public int lengthOfLongestSubstring(String s) {
 9         //记录字串,同时可以判断是否已存入
10         List<Character> list=new LinkedList<>();
11         int count=0;
12         int j=0;
13         int len =s.length();
14         while(j<len){  //不存在直接放入
15             if(!list.contains(s.charAt(j))){
16                 list.add(s.charAt(j));
17             }else{         //已存在,将于s.charAt(j)同字符之前于其一同删除
18                 //遇到同字符时判断一次此时长度是否目前最长,还有一种遍历到最后也要判断
19                 count= Math.max(count, list.size());
20                 Iterator<Character> iterator=list.iterator();
21                 while(iterator.hasNext()){
22                     char c=iterator.next();
23                     if(c!=s.charAt(j)){
24                         iterator.remove();
25                     }else{
26                         iterator.remove();
27                         break;
28                     }
29                 }
30                 list.add(s.charAt(j));
31             }
32             j++;
33         }
34         //出循环也要判断一次,因为最后一段没有判断长度
35         count= Math.max(count, list.size());
36         return count;
37     }
38 }

 

 

 

posted @ 2021-04-08 17:24  堤苏白  阅读(95)  评论(0)    收藏  举报