滑动窗口解决
题目描述:
思路:先定义两个数组分别存放t中的字符和window(滑动窗口的字符),然后定义两个指针,right一直往右走,直到window里的字符数量与字符种类达到t的要求(与need进行比较)停下来,再进行收缩窗口的操作,把左指针指的字符扔出去,如果其中window的数值满足need的要求,则vaild–。
char * minWindow(char * s, char * t)
{
int lens=strlen(s);
int lent=strlen(t);
//记录两个字符串的长度
int len=lens+1; //+1方便后续判断,如果还是+1则找不到任何字串
int* need=(int*)malloc(sizeof(int)*256);
memset(need,0,sizeof(int)*256);
//定义数组保存字符串t中的字母
int* window=(int*)malloc(sizeof(int)*256);
memset(window,0,sizeof(int)*256);
//定义数组保存window中的字符
int right=0;
int left=0;
int type=0;//t中所含的字符种类
int vaild=0;//window中所含的字符种类
int start=0;//最小字符串的开始,实时更新
for(int i=0;i<lent;i++)
{
need[t[i]]++;
}
//保存t中字符,处理了重复元素的情况
for(int i=0;i<128;i++)
{
if(need[i])
{
type++;
}
}
//计算t中共有多少种字符
while(right<lens)
{
//窗口扩大
char c=s[right];
right++;
//如果这个字符是需要的,则窗口数组对应的位置++
if(need[c])
{
window[c]++;
//等到两者数值相同,此时vaild++,vaild即滑动窗口中的字符种类
if(window[c]==need[c])
{
vaild++;
}
}
//等到window与t中的字符种类数量相同
while(vaild==type)
{
//更新最小字符串长度
if(right-left<len)
{
start=left;
len=right-left;
}
//对将要移出的元素进行判断
char d=s[left];
left++;
//如果是t中存在的字符
if(need[d])
{
//如果两个数组所含字符种类数量相同
if(window[d]==need[d])
{
vaild--;
}
}
window[d]--;//这个放在外面,不用理会d是不是t字符串中的元素,因为放在if判断里时,会导致出现重复元素时,元素扔出去了,window[元素]没有--。这是需要注意的。
}
}
//最后进行判断,返回字符串result
if(len!=lens+1)
{
char* result=(char*)malloc(sizeof(char)*(len+1));
*result='\0';
strncat(result, s + start, len);
return result;
}
//好难。。。。。。。。。
return "";
}
首先要明确strncat的功能是:从字符串src的开头拷贝n个字符到dest字符串尾部
函数介绍:
函数原型:char* strncat(char* dest, const char* src, int num)
头 文 件:#include <string.h>
返 回 值:返回dest字符串的起始地址
3015

被折叠的 条评论
为什么被折叠?



