1358. 包含所有三种字符的子字符串数目-滑动窗口

1358. 包含所有三种字符的子字符串数目

给你一个字符串 s ,它只包含三种字符 a, b 和 c 。

请你返回 a,b 和 c 都 至少 出现过一次的子字符串数目。

示例 1:

输入:s = “abcabc”
输出:10
解释:包含 a,b 和 c 各至少一次的子字符串为 “abc”, “abca”, “abcab”, “abcabc”, “bca”, “bcab”, “bcabc”, “cab”, “cabc” 和 “abc” (相同字符串算多次)。

示例 2:

输入:s = “aaacb”
输出:3
解释:包含 a,b 和 c 各至少一次的子字符串为 “aaacb”, “aacb” 和 “acb” 。

示例 3:

输入:s = “abc”
输出:1

解题代码如下:

int numberOfSubstrings(char * s){
    int count=0;
    int slen=strlen(s);
    int r[3];
    r[1]=0;
    r[2]=0;
    r[0]=0;
    int low=0,high=0;
   
   while(s[low]!='\0'){
        if(s[high]!='\0'){
            r[s[high]-'a']++;
               high++;
        }
        else{
            low++;
        }
        while(r[0]>=1&&r[1]>=1&&r[2]>=1&&s[low]!='\0'){
            printf("%d ",low);
            count=count+slen-high+1;
            r[s[low]-'a']--;
            low++;
        }
          if(s[high]=='\0'){
              break;
          }
    }
    return count;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值