前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每日一题 - 最长子串

每日一题 - 最长子串

作者头像
Taishan3721
发布2021-12-09 17:51:09
1890
发布2021-12-09 17:51:09
举报
文章被收录于专栏:这里只有VxWorks这里只有VxWorks

如转发 请标明出处!

来源:力扣(LeetCode)

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

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

建议先想一想再接着看

我的解答

代码语言:javascript
复制
#include <vxWorks.h>

/* 字符的取值在ASCII范围内, 种类不超过128, 因此返回值类型使用UINT8即可 */
UINT8 lengthOfLongestSubstring(UINT8 *s)
    {
    /* 记录每个字符是否出现过. 种类不超过128, 因此使用2个UINT64即可 */
    UINT64 record[2] = {0};

    /* 子串边界. 因为字符串长度不超过50000, 因此使用UINT16即可 */
    UINT16 left = 0;
    UINT16 right = 0;

    /* 最长子串长度. 入参为空时, 子串长度为0 */
    UINT8 len = 0;

    if(s != 0)
        {
        while(s[right] != 0)
            {
            /* 如果右边界的字符已出现过, 例如X */
            while((record[s[right]>>6] & (1<<(s[right]&0x3f))) != 0)
                {
                /* 清除上次的X及X之前的字符状态 */
                record[s[left]>>6] &= ~(1<<(s[left]&0x3f));

                /* 移动左边界到上次的X之后 */
                left++;
                }

            /* 记录新字符的状态 */
            record[s[right]>>6] |= 1<<(s[right]&0x3f);

            /* 记录子串长度 */
            if((1+right-left)>len)
                {
                len = 1+right-left;
                }

            /* 移动右边界 */
            right++;
            }
        }
    return len;
    }

与官方的主要区别

  • 不使用任何库函数
  • 使用128个bit来记录字符状态
  • 使用8个bit返回子串长度

我是泰山 专注VX好多年!

一起学习 共同进步!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-12-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 这里只有VxWorks 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档