Leetcode 3 Longest Substring Without Repeating Characters

3 Longest Substring Without Repeating Characters

最长的没有重复的连续子串

题目描述

在字符串中间寻找最长的没有重复元素的字串,
如: 对于asdac 结果是 sdac

思路

维持一个滑动窗口

建立头指针,尾指针,分别表示窗口的开始和结束位置。

从字符串头部开始。
将尾指针前移,把当前尾指针指向的元素加入窗口,如果尾指针遇到在窗口中重复出现的元素,则把头指针移动到该元素在窗口中上一次位置加一的位置。
然后维护maxlen变量,比较当前头尾之差与maxlen的差别更新maxlen。

继续推进尾指针直到结束。

代码

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int start, end, length, maxLength, templength;
        start = 0;
        end = 0;
        length = s.length();
        maxLength = 0;
        map<char, bool> hash; // 用一个char到bool的映射保存当前窗口内部的字符
        while (end != length) {
            // 找到当前元素是否出现过,且状态为true表示在窗口中
            if (hash.find(s[end]) != hash.end() && hash.find(s[end])->second != false) {
                // 要把start滑动到与当前元素相同的元素的后一位
                while (s[start] != s[end]) {
                    hash[s[start]] = false; // 随着头指针移动要把其指向的元素从窗口中移除
                    start++;  // 滑动start
                }
                hash[s[start]] = false;
                start++;
            }
            // 记录当前长度
            templength = end - start + 1;
            maxLength = maxLength < templength ? templength : maxLength;
            // 将当前长度对应的头尾位置加入记录
            hash[s[end]] = true;
            // end继续后移
            end++;
        }
        return maxLength;
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值