打卡第六天:找出最小覆盖字串

滑动窗口解决

题目描述:在这里插入图片描述
思路:先定义两个数组分别存放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字符串的起始地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值