LeedCode刷题笔记-最长子串问题

LeedCode刷题笔记-最长子串问题

题目描述

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

 

示例 1:

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

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

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:

输入: s = ""
输出: 0
 

提示:

0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成
通过次数785,590提交次数2,174,401

题目解法

int lengthOfLongestSubstring(char * s)
{
    //设置一个字符映射数组,来记录是否有重复字符产生
    int char_list[256] = {0};
    //设置变量,ret是返回值,取得是每一次的right - left的最大值
    //使用的是前后夹击的方法,来计算最长子串,最关键是left的取值
    //left应该是取遇到重复字符时,上一个字符的下标
    int right = 1, left = 0, ret = 0;
    while(*s != '\0')
    {
        //这里是来判断是否出现了重复字符, char_list[*s] 大于left时,
        //这时就是有重复字符,我们应该刷新左起点位置
        if(char_list[*s] > left)
        {
            left = char_list[*s];
        }
        //right用来记录,当前跑到了字符串第几个字符的位置
        char_list[*s] = right;
        //ret使用三目运算符来迭代得到最终的最大值,这个用法挺常见
        ret = ret > right -left ? ret : right -left;
        right++;
        s++;
    }
    return ret;
}

总结

  • 使用一个int数组来对字符串中的重复字符进行记录,因为字符是使用ASSIC编码,刚好也是256各字符
  • 使用right和left来对字符串的遍历进行记录,不过left的更新需要看是否在字符串中出现了重复字符,使用if(char_list[*s] > left),来进行判断,需要更新到上一个出现重复字符的下标位置,
  • 三目运算符的使用就很有意思了,可以递归循环获取整个子串的最大值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值