具体思路:
双状态没什么可说的;
前后缀则是记录左A右B的个数;
一维DP则是直接:
具体代码:
1.双状态dp:
class Solution {
public:
int minimumDeletions(string s) {
int n=s.size();
vector<vector<int>>dp(n,vector<int>(2,0));
if(s[0]=='a'){
dp[0][0]=0;
dp[0][1]=0;
}else{
dp[0][0]=1;
dp[0][1]=0;
}
for(int i=1;i<n;i++){
if(s[i]=='a'){
dp[i][0]=dp[i-1][0];
dp[i][1]=dp[i-1][1]+1;
}else{
dp[i][0]=dp[i-1][0]+1;
dp[i][1]=min(dp[i-1][0],dp[i-1][1]);
}
}
return min(dp[n-1][0],dp[n-1][1]);
}
};
2.前后缀:
class Solution {
public:
int minimumDeletions(string s) {
int maxn=INT_MIN;
int n=s.size();
vector<int>backarr(n+1,0);
vector<int>frontarr(n+1,0);
int frontpre=0;
for(int i=1;i<=n;i++){
if(s[i-1]=='a')
frontpre++;
frontarr[i]=frontpre;
}
for(int i=n-1;i>=0;i--){
backarr[i]=backarr[i+1];
if(s[i]=='b'){
backarr[i]++;
}
}
for(int i=0;i<=n;i++){
maxn=max(maxn,backarr[i]+frontarr[i]);
}
return n-maxn;
}
};
3.单状态dp:
class Solution {
public:
int minimumDeletions(string s) {
int n=s.size();
vector<int>dp(n,0);
int cntb=0;
if(s[0]=='b'){
cntb++;
}
for(int i=1;i<s.size();i++){
if(s[i]=='a'){
dp[i]=min(dp[i-1]+1,cntb);
}else{
cntb++;
dp[i]=dp[i-1];
}
}
return dp[n-1];
}
};