栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【Leetcode Hot 100 C++】(3)无重复字符的最长子串

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Leetcode Hot 100 C++】(3)无重复字符的最长子串

题目描述:

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。(中等)

示例 1:

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

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

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


算法思路

1、本题我的思路是设置两个指针P1,P2,一开始都指向字符串头部,再另设一个集合,如下图所示

2、我们将红色指针指向的元素放入集合中,然后移动红色的指针,若集合中没有此元素,则重复此过程,结果如下所示

 3、然后我们发现继续移动红色指针,发现元素不能放入集合中,整个时候,我们需要将集合中蓝色指针所指元素删除,然后再移动蓝色指针。

 

4、紧接着,我们发现可以继续移动红指针,则重复步骤2 

5、之后就一直重复2、3过程,直到红指针遍历结束 

最后返回值的问题记得在指针变化的时候适当保存一下就行。 


代码 C++
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int result = 0,n = 0;
        unordered_map map;//以map当作集合
        auto i =s.begin();//设置两初始指针
        auto j =s.begin();
        while(i != s.end()){
            if(map.find(*i) == map.end()){
                map[*i] = 1;
                n++;
                i++;
            }
            else{
                map.erase(*j);//移动前面指针时删除元素
                j++;
                n--;   
            }
            if(n > result){
                result = n;//n用于记录每一次结果
            }   
        }
        return result;
    }
};

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/832849.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号