一.题目
二.思路—滑动窗口
1.视频展示:
滑动窗口演示
2.详解
滑动窗口是一种基于双指针的思想,左右指针指向的几个元素形成一个窗口。
滑动窗口所应用的实际情况:
• 一般给出的数据结构是数组或者字符串
• 求取某个子串或者子序列最长最短等最值问题。
• 通过暴力求解可以得到
(1)创建一个新数组。
(2)初始状态下,left和right指针都指向第0个元素 ,[ left , right )左闭右开。
(3)strchr函数
strchr函数可以查找字符串str中第一个字符character所在的位置。
(4)从第一个字符开始遍历,不重复的字符放到新数组中,遇到重复的(strchr的返回值不为空)就停止,修改新数组的起始位置left,并计算新数组的长度。
(5)开始下一段循环,直到遍历到字符串结束。
(6)再循环结束后,我们找到最长的子串的长度就是答案。
(6)图解
三.参考代码
int lengthOfLongestSubstring(char* s) {
//滑动窗口
if(s == NULL)
{
return 0;
}
int sz = strlen(s);
char* tmp = (char*)calloc(sz,1);
int maxlength = 0;
int left = 0,right = 0,i = 0;
for(i = 0;i < sz;i++)
{//要先判断是否存在重复字符再进行复制
char* p = strchr(tmp + left,s[i]);
tmp[right] = s[i];
right++;
if(p)//如果该重复字符存在,就跳到前面重复字符的下一个位置
{
left = p - tmp + 1;
}
int curlength = right - left;//当前窗口大小
if(maxlength < curlength)//求最长
{
maxlength = curlength;
}
}
return maxlength;
}