它一上来先定了一个数组,然后用for循环,循环条件是一个我看不懂的东西,我迷茫至极,想请问此题何解?
4条回答 默认 最新
- 技术专家团-小桥流水 2023-11-04 20:49关注
思路:
因为字符的正数范围是从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即可。运行结果:
代码:
#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; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥30 电脑误删了手机的照片怎么恢复?
- ¥15 (标签-python|关键词-char)
- ¥15 python+selenium,在新增时弹出了一个输入框
- ¥15 苹果验机结果的api接口哪里有??单次调用1毛钱及以下。
- ¥20 学生成绩管理系统设计
- ¥15 来一个cc穿盾脚本开发者
- ¥15 CST2023安装报错
- ¥15 使用diffusionbert生成文字 结果是PAD和UNK怎么办
- ¥15 有人懂怎么做大模型的客服系统吗?卡住了卡住了
- ¥20 firefly-rk3399上启动卡住了