力扣_3.无重复字符的最长子串

题意

给定一个字符串,请你找出其中不
含有重复字符的 最长子串 的长度。

题意解读

1.这个子序列所有的元素都是不重复的
2.这个子序列是连续的

样例

示例 1:
输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

思路

错误思路

我开始的时候,我想的是标记,没有考虑位置。
标记我感觉能做,但是奈何实际编写能力太差。
我们做算法的目的,不仅仅是为了AC题目的快感(AC是快乐的)。
还有就是在做题过程中的思路,以及做完之后的总结。
我觉得过程对我们的思维训练尤为重要。三个字总结:为什么

正确思路

在思考的过程中,我们要得到发现无重复最长字串,我们不能直接标记,
我们应该想什么时候,记录答案的数值重置。比如yww,当前在第二个位
置,那么当遇到当前的字串出现过,就是该重置的时候,用队列来实现。
我这里不用,直接数组来维护位置之间的关系。
通过下标之间的关系,来确定最长不重复子串。

代码

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int vis[256];//这里的意思是标记256个字符。
        memset(vis,-1,sizeof vis);//初始值设为-1,为什么不是0.这样设置不需要特判。
        int st = -1, res = 0;//
        for (int i = 0; i < s.size(); i ++)
        {
            if (st < vis[s[i]]) st = vis[s[i]];//这里的目的就是更新状态
            vis[s[i]] = i;
            res = max(res, i - st);//得到答案
        }
        return res;
    }
};

第一次写博客,欢迎指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值