动态规划、贪心算法、字符串
C. Get an Even String – cf#780(div3)
题意:给出一定数量的字符串,需判断至少要删掉几个字符,才能满足 字符串中每个基数个字符都等于其后面的字符
题解:只需从头便利一边即可,第一个有第二个的字符,这两个字符都是我们所需要的,其中间的字符都要删去。(贪心)
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
string str;
cin>>str;
int nn=str.size();
int m=0;
vector<bool>ve(26,false);//vector初始化
for(int j=0;j<nn;j++){
if(ve[str[j]-'a']){
m+=2;
for(int w=0;w<26;w++){
ve[w]=false;
}
}else{
ve[str[j]-'a']=true;
}
}
cout<<nn-m<<endl;
}
}
C. Canine poetry
题意:给定一个字符串,求判断至少要删除几个字符,才能保证字符串中一个回文串都没有。
题解:贪心,找规律发现只要破坏最小的回文串就够了,所以只需要考虑 aaa aba aa这三种情况就够了,使得字符串中不存在这三类字符串即可。
[题目链接](Problem - C - Codeforces)
#include <bits/stdc++.h>
using namespace std;
void solve() {
string str;
cin>>str;
int sum=0;
for(int i=0; i<str.size()-1; i++) {
if(str[i]=='#')continue;
if(str[i]==str[i+1]) {
str[i+1]='#';
sum++;
}
if(i+2<str.size()&&str[i]==str[i+2]) {
str[i+2]='#';
sum++;
}
}
cout<<sum<<endl;
}
int main() {
int n;
cin>>n;
while(n--) {
solve();
}
}