leecode刷题记录

本文介绍了如何通过维护滑动窗口和字符上一次出现位置的数组,解决LeetCode中无重复字符的最长子串问题,详细解释了更新窗口左边界的方法、数组大小选择以及代码实现。
摘要由CSDN通过智能技术生成

03:无重复字符的最长子串

分析:

①子串和子序列不同,子串必须是连续的一段字符串,而子序列可以不连续;

②vector定义一维数组:

③思路:

维护一个滑动窗口,保证窗口内不含有重复字符,对字符串进行遍历,每遍历一个字符就把他加入到窗口内,同时更新窗口的左边界,保证窗口内没有重复元素;则遍历结束之后,就能得到最长的窗口长度;

重点:

一、如何更新窗口的左边界:

窗口左边界的维护依赖于新加入字符上一次出现的位置,如果上一次出现的位置在窗口外,则左边界不需要变化;如果上一次出现的位置在窗口内,则左边界更新为当前字符上一次出现位置的下一个位置。

因此,便利的同时需要一个数组来记录每一个字符上一次出现的位置。

二、数组大小:

题目说字符串是由字母、数字、符号和空格组成,可以开一个长度为128的数组来存储。

理由:

当数组的下标是字符时会带入ASSII码值进行运算,数组长度128即代表128的字符的所有可能,如果是用字典来理解的话就是,键是字符,而值是这个字符上一次出现的位置。

三、pos[s[i] ]代表的是当前字符上一次出现的位置,初始值为一开始赋值的-1,后由第九行代码赋值,下一次循环生效;

四、窗口大小 = 右边界 — 左边界 + 1

解答:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
    vector<int> pos(128,-1);
    int ans=0;
    for(int i = 0,j = 0; i < s.length() ; i++){
        j = max(j, pos[s[i]]+1);
        ans = max(ans,i - j + 1);
        pos[s[i]] = i;

    }   
    return ans;
}
};

视频讲解:哔哩哔哩——睡不醒的鲤鱼——Leecode 每日一题第三题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值