题意
问一个字符串最多可以分离出多少个形如
′
′
x
t
C
p
c
′
′
''xtCpc''
′′xtCpc′′的子序列(字符串的每个字符只能使用一次)。
链接:link。
思路
由于给出的子序列的每一个字符都是不一样的,所以可以构造一个贪心算法:
用
c
n
t
[
i
]
cnt[i]
cnt[i]记录到目前为止,子序列各个字符的数量。当访问到第
i
i
i个字符时,如果子序列中的字符,并且比其前一个字符的数量少,那么可以用该字符构造子序列,将其加入到
c
n
t
[
j
]
cnt[j]
cnt[j]中。
时间复杂度分析
顺序遍历字符串即可,时间复杂度为 O ( n ) \mathcal{O}(n) O(n)。
实现
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
const string MATCH="xtCpc";
string str;
int n;
int main(){
while(cin>>n){
cin>>str;
int cnt[5]={0};
for(int i=0;i<n;i++){
if(str[i]==MATCH[0]) cnt[0]++;
for(int j=1;j<5;j++){
if(str[i]==MATCH[j]&&cnt[j]<cnt[j-1]){
cnt[j]++;
}
}
}
printf("%d\n",cnt[4]);
}
return 0;
}