剑指 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 }
· 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应用必不可少的技术