Leetcode 3 Longest Substring Without Repeating Characters

题意

给定一个字符串,求出最长的无重复字符的子串

题目链接

https://leetcode.com/problems/longest-substring-without-repeating-characters/description/

题解

可以用滑动窗口来解决问题,因为在这道题中窗口的左端点不会向左回退

滑动窗口模板

int l = 0;
int r = 0;
while( r < 滑动窗口的右端点) {
	更新窗口元素(一般跟r有关);
	r++;
	while( 窗口中的元素不满足条件){
		更新窗口(一般跟l有关);
		 l++;
	}
}
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int l = 0;
        int r = 0;
        unordered_map<char, int> mp;
        int ret = 0;
        while(r < s.size()) {
            mp[s[r]]++;
            r++;
            while( mp[s[r-1]] > 1) {
                mp[s[l]]--;
                l++;
            }
            ret = max(ret, r - l);
        }
        return ret;
    }
};

这里需要注意的是由于r++在前面,而我们判断的时候是当前的窗口的最后一个字符是否出现了不止一次,当前的数组下标是r-1, 而且计算长度的时候正常是r-l+1,但由于少了r先++了,计算的时候应该用r-l
事件复杂度: O ( n ) O(n) O(n) n为字符串的长度
空间复杂度: O ( n ) O(n) O(n) 需要存储一个map,字符和个数的hashmap

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值