leedcode热题Hot100---03无重复字符的最长子串

这篇博客介绍了如何利用Map数据结构解决寻找字符串中无重复字符的最长子串问题。通过遍历字符串,将当前子串中的字符及其索引存入Map,当遇到重复字符时更新最长子串长度,并重新开始计算。时间复杂度为O(N),空间复杂度为O(N)。
摘要由CSDN通过智能技术生成

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

示例1:

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

示例2:

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

示例3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

示例4:

输入: s = ""
输出: 0
题解:

思路:map键值对唯一的特性,与题中子串无重复字符不谋而合,因而采用map进行存储当前子串中每个字符对应原串中的位置索引,便于计算子串长度。一旦当前遍历的字符在字串中存在(即map中出现过),则中止当前子串,开启新一轮子串并同时更新map集合。全程用len记录最长子串长度。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {

        //空字符串返回0
        if(s.length() == 0){
            return 0;
        }

        //map集合只存放当前正在计算长度的字符串中每个字符在s中的索引位置
        //不管上次
        map<char, int> mp;
        //初始化,字符串s中的第一个字符对应索引为0
        mp[s[0]] = 0;
        //记录下次子串的起始位置
        int start = 0;

        //int pre = start;
        //记录当前子串的起始位置
        int front = start;
        //用来记录最长子串的长度
        int len = 1;

        for(int i = 1; i < s.length(); i++){//遍历字符串中的每个字符
            //如果当前字符未出现在map集合中,则将该字符加入map集合
            while(i < s.length() && mp.count(s[i])==0){
                mp[s[i]] = i;
                i++;
            }
            //循环结束,代表当前子串中的字符无重复,当前s[i]为重复字符,计算长度为i-start,更新len
            len = (i-start) > len ? (i-start) : len;
            //cout <<len << s[i] << "%";
            //如果i处于最后一个位置或全部遍历结束,则退出循环
            if(i >= s.length()-1){
                break;
            }
            //更新start为重复字符的上一次出现位置的后一个位置作为下一次子串的起始位置
            start = mp[s[i]] + 1;
            //从当前子串的起始位置到重复字符的上一次出现位置之间的所有字符都要移出map
            for(int j = front; j <= mp[s[i]]; j++){
                //cout <<s[j];
                mp.erase(s[j]);
                //pre++;
            }
            //cout << endl;
            //更新front位置为下次循环子串的起始位置
            front = start;
            //更新map中字符s[i]出现的位置
            mp[s[i]] = i;
            //front = pre+1;
            // pre = start;
        }

        return len;
    }
};

记N为原字符串长度

时间复杂度:O(N)

空间复杂度:O(N)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值