3. 无重复字符的最长子串

题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

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

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

解题:
1.暴力破解(爬动窗口)
暴破的话就是双层循环,将所有字串都遍历一遍,现在匹配得子字符串就是一个窗口,当我们遇到重复的字符时,我们会将我们的窗口往后移一位。当窗口位置位于 [i,j)时,在j这个位置上匹配到了重复字符,我们会将i+1,新窗口为[i+1,i+1+1),匹配的字符为i+1+1,

首先双层循环,i从0n-1,j从i+1n-1从这两层循环里得到所有的字串。
使用java的indexOf方法判断,已匹配的字符串中是否包含该字符。

代码:
class Solution {
public int lengthOfLongestSubstring(String s) {
int len=s.length();
if(len==0){
return 0;
}
int max=1;
int count=1;
for(int i=0;i<len;i++){
count=1;
for(int j=i+1;j<len;j++){
if(s.indexOf(s.charAt(j),i)<j){ //在中间有这个字符
break;
}
else{ //中间无字符
count=j-i+1;
max=(max>count?max:count);
}
}
}
return max;
}
}

2.滑动窗口
既然是模式串匹配,那么肯定是要有优化的滑动窗口的。
在匹配中我们遇到重复字符,不能i+1,比如目前窗口是[i,j),在j位匹配到重复字符,我们已经知道在在[i,j-1]窗口内是没有重复字符的,而在j位就存在了重复字符,重复的位置在s位,那么我们再去匹配[i+1,i+1+1]到[i+1,j]是没有意义的,因为一定会有重复字符,而且长度会小于之前的长度。所以我们直接将窗口滑到匹配到的重复字符s的位置。即新窗口为[s+1,s+1);

代码:
class Solution {
public int lengthOfLongestSubstring(String s) {
int n=s.length();
var set=new HashSet();
int i=0,j=0,len=0;
while(i<n&&j<n){
if(set.contains(s.charAt(j))){
set.remove(s.charAt(i++));
}else{
set.add(s.charAt(j++));
len=Math.max(len,j-i);
}
}
return len;
}
}

posted @   堤苏白  阅读(106)  评论(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应用必不可少的技术
点击右上角即可分享
微信分享提示