无重复字符的最长子串(刷题日常)

发布时间:2024年01月01日

(前段时间在准备考试,停止刷题了,今天才开始继续刷题)

自我介绍:一个脑子不好的大一学生,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年顺风顺水,快快乐乐地进步啦!

文章来源:https://blog.csdn.net/2301_79293429/article/details/135295546
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。