力扣周赛325:到目标字符串的最短距离,每种字符最少取k个

这篇博客探讨了两个算法问题:一是寻找字符串中特定字符的最短匹配距离,二是计算满足特定条件的滑动窗口最大长度。文章通过`takeCharacters`函数展示了如何在字符串中找到满足条件的滑动窗口,并返回其最小长度。同时,`intclosetTarget`函数用于查找字符串数组中目标字符的最短匹配路径。这两个算法都涉及到字符串处理和循环结构的巧妙运用。
摘要由CSDN通过智能技术生成

 

 

int closetTarget(char**words,int wordsSize,char*target,int startIndex){
       if(strcmp(target,words[startIndex])==0)//若目标和给定位置的字符相同返回0
              return 0;
       int nextRight=startIndex;
       int nextLeft =startIndex;
       int count=0;
       bool falg=false;
       do{//判断字符串和target是否一致
          if((strcmp(target,words[nextRight])==0)||strcmp(target,words[nextLeft])==0){
                flag=true;
           }else{
                count++;
                nextRight=(nextRight+1)%wordsSize;//向前移动
                nextLeft=(nextLeft-1+wordsSize)%wordsSize;//向后移动
           }
          if(flag){//找到满足条件的字符串,跳出循环
                break;
           }
         }while(nextRight!=startIndex);
        if(nextRight==startIndex){//没有找到,返回-1
                return -1;
         }else{//找到,返回最短距离
                return count;
           }
         }

 

 

 

class Solution{
public:
    int takeCharacters(string s,int k){
        int a=count(s.begin(),s.end(),'a'),b=count(s.begin(),s.end(),'b'),c=count(s.begin(),s.end(),'c'),n=s.size();//计算总数
       if(a<k||b<k||c<k)
             return -1;
       a-=k,b-=k,c-=k;
       vector<int>nums(3),check{a,b,c};//num记录abc的数目,check为上限
       int ans=INT_MAX,i,j;
       for(i=0,j=0;j<s.size();j++)//寻找滑动窗口的最大长度
        {
            nums[s[j]-'a']++;
            if(nums[s[j]-'a']>check[s[j]-'a'])
             {
              while(nums[s[j]-'a']>check[s[j]-'a'])
              {
                 nums[s[i]-'a']--; 
                 i++; 
              }
             }
             ans=min(n-(j-i+1),ans);
         }
         return ans;
       }
  };

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值