Leetcode:无重复字符的最长子串
题目描述:****
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
**输出: **3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
**输入: **s = "bbbbb"
**输出: **1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:
**输入: **s = ""
输出: 0
提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成
利用哈希,myHash[s[i]]保存的是当前字符的位置+1,如s=“abc”,myHash['a']=0+1;myHash['b']=1+1;myHash['c']=2+1;
单指针做法:其中 left=myHash[s[i]];是要更新边界值,当重复字符出现的时候,把左边界移动到这个相同字符上一次出现的后一个位置。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int myHash[256]={0};
int left=0;
int ans=-99;
if(s.size()==0) return 0;
for(int i=0;i<s.size();i++){
if(myHash[s[i]]&&myHash[s[i]]>left){
left=myHash[s[i]];
}else{
ans=max(ans,i-left+1);
}
myHash[s[i]]=i+1;
}
return ans;
}
};
双指针做法:
利用左右指针定义边界,
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int myHash[256]={0};
int left=0;int right=0;
int ans=-99;
if(s.size()==0) return 0;
while(left<s.size()&&right<s.size()){
if(myHash[s[right]]==0){
myHash[s[right]]++;right++;
ans=max(ans,right-left);//right已经提前+1,所以只用right-left
}else{
while(left<right&&s[right]!=s[left]){
myHash[s[left]]--;left++;
}
myHash[s[left]]--;left++;//把出现过的值移出有效区
}
}
return ans;
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律