剑指offer Leetcode 48. 最长不含重复字符的子字符串

image-20201215164310669

解法1:滑动窗口

思想:

​ 用set维护一个不重复的滑动窗口,得到以s[right]为结尾的最长无重复子串(即s[left]到s[right])。

复杂度:

​ ●时间:O(N),for循环需遍历n次,while循环只有重复才执行,就算最坏情况下全部重复也就执行N次,所以O(N) + O(N)

​ ●空间:O(1),set中最多存储128个数。使用vector效率更高。

代码:
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int res = 0;
        unordered_set<char>my_set;
        for(int left = 0, right = 0; right < s.size(); right++){
            //如果s[right]重复了,就从left开始弹出(left++),直到不重复
            while(my_set.find(s[right]) != my_set.end())
                my_set.erase(s[left++]);
            //插入当前s[right]字符
            my_set.insert(s[right]);
            //因为当前只是以s[right]结尾的最长子串,所以每轮需要更新一下
            res = max(res, right - left + 1);
            //res = max(res, int(my_set.size())); 用set.size()更好理解一点,因为里面都是不重复的
        }
        return res;
    }
};
改进:

​ 思想:关于字符的set都可以用vector来代替,这样可以提高效率。

​ 注意:可以用vec_exist[s[right]]来直接访问数组,即ASCII码为index直接访问

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if(s.size() <= 1)
            return s.size();
        int res = 0;
        //注意题目说的是字符,不是字母,所以要128个
        vector<int>vec_exist(128, 0);
        for(int left = 0, right = 0; right < s.size(); right++){
            while(vec_exist[s[right]] > 0)
                vec_exist[s[left++]] = 0;
            vec_exist[s[right]] = 1;
            res = max(res, right - left + 1);
        }
        return res;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值