O(n)复杂度思路(未完成)
2023-09-15 17:29:13
发布于:广东
1阅读
0回复
0点赞
类似前缀和与数组存储下标的思路应该能得出正确答案
#include<bits/stdc++.h>
using namespace std;
int k,a=0,c1=0,c2=0;//c变量用于搭配b数组使用
string s;
char a1,a2;
int main(){
cin>>k>>s>>a1>>a2;
int l=s.length()-1;
int b1[l],b2[l],f1[l],f2[l],d1=1,d2=1;//d变量用于搭配f数组使用
for(int i=0;i<l;i++)if(s[i]==a1)f1[i]+=d1++,b1[c1++]=i;//f数组存a1,a2字符的个数
for(int i=0;i<l;i++)if(s[i]==a2)f2[i]+=d2++,b2[c2++]=i;//b数组存储含有a1,a2字符数组的下标,在后面的循环内使用
for(int i=0;i<c1;i++){//这个循环段代码需要进行很大的修改
int r=0;//用于寻找第一个大于第i个a1字符下标的a2字符下标
if(b1[i]>b2[r])r++;//当第i个a1字符的下标大于第r个a2字符的下标时,r+1
else{//因为两个字符无法在同一位置,所以不存在==判定
if(b2[r]-b1[i]>=k-1)a+=f2[b2[c2-1]]-f2[b2[r-1]];
//当第i个a1与第r个a2的子串长度大于k时,将以第i个a1字符为首组成的子串的所有可能以类似前缀和的方式存在a变量中
else a+=f2[b2[c2-1]]-f2[b2[r]];
//如果条件不成立,将以第i个a1字符为首组成的子串的所有可能的子串个数 -1 以类似前缀和的方式存在a变量中
}
}cout<<a;
}
本代码存在一堆问题,可以根据这段代码的思路自己做一遍。
当然,这种没人做出来的题也可能存在测试点问题(虽然可能性很小)
这里空空如也
有帮助,赞一个