来个简易题解
2026-01-28 14:08:41
发布于:浙江
2阅读
0回复
0点赞
本题要求删除部分字母,使得删除后的字符串 t 和原字符串 s 前 |t| 位相同。由于本题交换位置没有任何代价,我们只需要考虑删除多少是合适的。
要考虑删除多少,有点麻烦,因为我们需要先知道需要保留多少字母。那我们反过来,直接考虑会保留多少字母。
什么样的字母会被保留呢?我们无法改变 s 的顺序,我们修改 t 的,让其合法能保留下来。
当 s[i] = 1 的时候, t[i] 就必须为 0。
当 s[i] = 0 的时候, t[i] 就必须为 1。
那如果不够怎么办?比如,当 s[i] = 1 的时候已经没有多余的 0 可以交换过来。我们直接结束,因为当前位置不合法后续位置合法也无意义。
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
cin >> s;
int num0 = 0, num1 = 0;//统计有多少 1 和 0 可以用
for(int i = 0; i < s.size(); i ++){
if(s[i]=='0') num0++;
if(s[i]=='1') num1++;
}
int i;
for(i = 0; i < s.size(); i ++){
if(s[i]=='0') {
if(num1==0) break;
num1--;
}
if(s[i]=='1') {
if(num0==0) break;
num0--;
}
}
cout << s.size() - i;
return 0;
}
这里空空如也

有帮助,赞一个