刷题日记|无重复字符的最长子串

这题是考察经典的滑动窗口算法。

滑动窗口算法的一个主要思路就是通过不断移动的left和right两个边界,动态地扩大或者缩小这个窗口,进而找到符合条件的连续子列。

这题我觉得一个比较妙的思路就是创建了这样的一个数组:int last_seen[256];
这样的高明之处在于由于标准的ASCII码就是从0~255编码,所以数组的下标刚好可以对应某一个字符。然后把这个数组的值全部初始化为-1之后,我们就可以通过对应下标的值来表示该字符最后一次出现的索引位置。
有点哈希表的感觉了。

memset(last_seen, -1, sizeof(last_seen));
在这里memset()的原型是void *memset(void *ptr, int value, size_t num);

void *ptr:要填充的内存起始地址(万能指针,数组、malloc 堆内存都能用)
int value:要填充的字节值(只会取低 8 位,0~255 有效)
size_t num:要填充多少个字节

for(int right = 0;right < strlen(s);right++)
和
int len = strlen(s); for(int right = 0;right < len;right++);
的主要区别就在于上面的代码没跑完一次循环就会执行一次strlen(s),而下面的代码只会执行一次strlen(s),所以下面代码的速度远快于上面。

posted @ 2026-10-02 23:25  勾木  阅读(3)  评论(0)    收藏  举报