面试题48:最长不含重复字符的子字符串

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

 

示例:

 

给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。

 

给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。

 

给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串,"pwke" 是 子序列 而不是子串。

 

思路:

总共只用一个vector,如果发现重复的字符,把当前vector的大小记录下来,然后删除重复字符之前的所有字符

例如tabcadebb

v里面一个一个存,直到第二个a的出现, 这时,存下来当前v的长度,也就是v = tabc = 4

这时候删掉a和a之前的所有字符 v = bc 然后把现在这个a记录到后面 v = bca

这样的话只需要重复一遍,而且代码十分容易理解

 

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
    auto it1 = s.begin();
    vector<char> v; //储存字符串的vector
    int max = 0; //最后输出的最长的字符串的个数
    int lin = 0; //字符串的个数(不一定是最长的)

    while (it1 != s.end()) {
        auto it3 = find(v.begin(), v.end(),*it1); //查询v里面有没有当前要插入的字符
        if (it3 == v.end()) { //如果没有找到
            v.push_back(*it1); //就把这个字符放在v的最后面
            lin++; //并且让这个字符串的大小加一
        }
        else { //如果当前vector里面已经有这个字符了
            if (max < lin) max = lin; //那么把lin存一下,如果之前已经有比lin长的字符串了,那么就不存
            v.erase(v.begin(), it3+1); //把包括当前重复的字符和它以前的所有字符都删掉
            v.push_back(*it1); //然后将刚刚的字符插在v的最后面
            lin = v.size(); //lin等于新的vector的大小
        }
        it1++; //指针指向下一个字符
    }
    if (max < lin) max = lin; //确保max里面是最长的字符串的长度
    return max;
    }
};

参考博客:

https://blog.csdn.net/weixin_42624114/article/details/81631682

 

对以上加速代码的解释:

https://blog.csdn.net/qq_32320399/article/details/81518476

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值