(前段时间在准备考试,停止刷题了,今天才开始继续刷题)
自我介绍:一个脑子不好的大一学生,c语言接触还没到半年,若涉及到效率等问题,各位都可以在评论区提出见解,谢谢啦。
该账号介绍:此帐号会发布游戏(目前还只会简单小游戏),算法,基础知识等内容。
文章特点:会将重要步骤和易错点在代码中用注释标示(方便各位理解和定位)
本文介绍:无重复字符的最长子串,运用了哈希表(一种数据结构,也可称为数组,具体理解办法已放在代码中,各位可自行查看,若有疑问,也可发布问题在评论区,大家共同进步)
(题目链接:3. 无重复字符的最长子串 - 力扣(LeetCode))
//哈希函数:把value转换为key
//哈希表:实际上是一个数组,也是一个数据结构,存放的是键值对
//键值对:
// 举例:
// 学号 姓名
// 2010 张三
//学号就是key(键),姓名就是value(值)
int zuichangzichuan(char* s)//字符串传参
{
int n = strlen(s);//记得包含头文件string.h
if (n == 0)//如果为空
return 0;
int max = 1;
//标准字符已有符号有128个
int j = 0;
for (int i = 0; i < n; i++)
{
int hash[256] = { 0 };
/*哈希表,应该在这个循环内定义,因为每次都要重置哈希表里的值*/
/*得有两个循环,一个是左指针(i),一个是右指针(j)*/
for(j=i/*关键点*/; j<n; j++)
{
if (hash[s[j]] == 0)
{
/*虽然hash数组是int类型的数组,但是下标可为字符,系统会自动转化为ASCLL码值*/
hash[s[j]] = 1;
if (j - i + 1 > max)
max = j - i + 1;
}
else//出现了重复字符
break;
}
}
return max;
}
int main()
{
char s[50010] = { 0 };
gets(s);
int max=zuichangzichuan(s);
printf("%d\n", max);
return 0;
}
元旦快来了,祝大家在2024年顺风顺水,快快乐乐地进步啦!