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;
    }
};
posted @   Dreamer_szy  阅读(20)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示