蓝桥杯/字串简写/c++

问题描述

    程序猿圈子里正在流行一种很新的简写方法:对于一个字符串,只保留首尾字符,将首尾字符之间的所有字符用这部分的长度代替。例如international-alization 简写成 i18n, Kubernetes(注意连字符不是字符串的一部分)简写成K8s ,Lanqiao 简写成L5o 等

    在本题中,我们规定长度大于等于K的字符串都可以采用这种简写方法(长度小于K的字符串不配使用这种简写)。 给定一个字符串S和两个字符c1和c2,请你计算S有多少个以c1开头 c2结尾的字串可以采用这种简写?

输入格式

    第一行包含一个整数K 。第二行包含一个字符串S和两个字符c1 和 c2.

输出格式

4
abababdb a b

样例输出

6

参考解法:

#include <bits/stdc++.h> 
using namespace std;
int K;
long long ans=0,c1_sum=0;
string S;
char c1,c2;
int main(){
    cin>>K>>S>>c1>>c2;
    //以C2为右端点,找到距离大于等于K的所有C1,把每一个C2满足条件的C1数量都加起来即结果
    for(int i=K-1,j=0;i<S.length();i++,j++)     
    {
        if(S[j]==c1) c1_sum++;       
        if(S[i]==c2) ans+=c1_sum;
    }
    cout<<ans;
    return 0;
}
//放缩思想,长的一定包含了短的情况,因此只要K的长度固定找到满足条件的即可
//每次都记录前指针有几次指向了a,由于指针的长度是一定满足K的,所以当后指针指向b的时候,我们就可以记录次数

法二:记录前缀和

#include<bits/stdc++.h>
using namespace std;
int n,l,c[500005];
long long sum;
char s[500005],a,b;
int main(){
  scanf ("%d\n%s %c %c",&n,s+1,&a,&b);
  l=strlen(s+1);
  for(int i=1;i<=l;i++){
    if (s[i]==a) c[i]++;
    c[i]+=c[i-1];
    if (i>=n&&s[i]==b){
      sum+=c[i-n+1];
    }
  }
  cout<<sum;
  return 0;
}

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值