子数组系列

Longest Substring Without Repeating Characters (Medium)

问题描述

给出一个数组,求其连续不重复子数组最大长度,原代码见 GitHub 17/05/25

Examples
Input
Given "abcabcbb",
Output
The answer is "abc", which the length is 3

算法思路

  • 若碰到重复字符,要求达到目标数组两边动态伸缩目的,需要设置两个边界变量

  • 奔跑者 在前面奔跑,每次都把当前字符存入 Set,若集合中已存在该字符,则停止奔跑

  • 行走者 在后面行走,每次都把当前字符移出 Set,若当前字符与 奔跑者 当前字符相同,则停止行走

通过以上算法,便可达到动态伸缩不重复子数组的目的,最大长度求解也变得相当简单

AC 代码

int lengthOfLongestSubstring(string s) {
    set<char> set;
    int max = 0;
    int walker = 0, runner = 0;
    while (runner < s.size()) {
        char rc = s.at(runner);
        if (set.find(rc) != set.end()) {
            char wc;
            /*
                when two chars at walker and runner are equals
                walker stops
             */
            while ((wc = s.at(walker++)) != rc) {
                set.erase(wc);
            }
        } else {
            set.insert(rc);
        }
        if (max < runner - walker + 1) {
            max = runner - walker + 1;
        }
        runner++;
    }
    return max;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值