链接:
https://leetcode.cn/problems/minimum-deletions-to-make-string-balanced/
题意:
给一个字符串,可以删除任意字符,求将字符串变成前a后b的最小步骤数(可以没有b或者没有a)
解:
预处理,前缀b和后缀a,也就是找出每个a前的b,和每个b后的a,找一个ab,判断如果把这个点当做分界线的话,需要多少操作
然后再和只留a和只留b的情况比较一下
实际代码:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
const int Nmax=1E5+3;
int qzb[Nmax],hza[Nmax];
int solve(string s)
{
int lgs=s.length();
for(int i=0;i<lgs;i++)
{
if(i)
{
if(s[i]=='b') qzb[i]=qzb[i-1]+1;
else qzb[i]=qzb[i-1];
}
else if(s[i]=='b') qzb[i]++;
//cout<<qzb[i]<<endl;
}
//cout<<endl;
for(int i=lgs-1;i>=0;i--)
{
if(s[i]=='a') hza[i]=hza[i+1]+1;
else hza[i]=hza[i+1];
//cout<<qzb[i]<<endl;
}
int ans=min(qzb[lgs-1],hza[0]);
for(int i=0;i<lgs-1;i++)
{
if(s[i]=='a'&&s[i+1]=='b') ans=min(ans,qzb[i]+hza[i+1]);
//cout<<ans<<endl;
}
//cout<<ans<<endl;
return ans;
}
int main()
{
string s;cin>>s;
int ans=solve(s);
cout<<ans<<endl;
}
限制:
1 <= s.length <= 105
s[i]
要么是'a'
要么是'b'
。