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

题目:

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

 

示例 1:

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

示例 2:

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

示例 3:

"wke"
"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 @   堤苏白  阅读(56)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示