Compulsived 2023-11-04 19:30 采纳率: 84.6%
浏览 11
已结题

这是CSDN每日一练的题

img

img


它一上来先定了一个数组,然后用for循环,循环条件是一个我看不懂的东西,我迷茫至极,想请问此题何解?

  • 写回答

4条回答 默认 最新

  • 关注

    思路:
    因为字符的正数范围是从0到127,所以hset[128]正好可以用来标记128个字符是否出现过。
    没出现过则把对应字符对应的下标元素标记为0,出现过则标记为1。
    逐个遍历s中的字符,对s中的某个字符s[j],判断是否已经出现:
    如果没出现,就把当前子串的长度+1(用i记录),并标记该字符已出现过(hset[s[j]]=1),然后继续判断下一个字符。
    如果已经出现,就比较当前子串的长度i与m(m记录最长子串的长度),如果i>m,就更新m的值,并重置hset,并把s[j]作为新子串的第一个字符,并继续判断后续字符。
    以此类推,直到所有字符遍历完毕,最后输出m即可。

    运行结果:

    img

    代码:

    #include <stdio.h>
    #include <string.h>
    
    int hset[128];
    int lengthOfLongestSubstring(char *s)
    {
        int i=0,j=0;
        int m=0;
        memset(hset,0,sizeof(hset));
    
        for(;s[j]; j++)
        {
            if(hset[s[j]] == 0)  //不存在,则长度+1,并更新标记
            {
                i++;
                hset[s[j]]++;
            }else //已存在,则判断当前长度与最大长度
            {
                if(i>m)
                    m = i; //更新
                i=1;
                memset(hset,0,sizeof(hset));
                hset[s[j]]=1; //当前重复,从当前开始
            }
        }
    
    
        return m;
    }
    
    
    int main()
    {
        char buf[100000]={0};
        int m;
        scanf("%s",buf);
        m = lengthOfLongestSubstring(buf);
        printf("%d",m);
        return 0;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 11月12日
  • 已采纳回答 11月4日
  • 创建了问题 11月4日

悬赏问题

  • ¥30 电脑误删了手机的照片怎么恢复?
  • ¥15 (标签-python|关键词-char)
  • ¥15 python+selenium,在新增时弹出了一个输入框
  • ¥15 苹果验机结果的api接口哪里有??单次调用1毛钱及以下。
  • ¥20 学生成绩管理系统设计
  • ¥15 来一个cc穿盾脚本开发者
  • ¥15 CST2023安装报错
  • ¥15 使用diffusionbert生成文字 结果是PAD和UNK怎么办
  • ¥15 有人懂怎么做大模型的客服系统吗?卡住了卡住了
  • ¥20 firefly-rk3399上启动卡住了