Maximize cost of removing all occurrences of substrings “ab” and “ba”
Given a string S and integers P and Q, which denotes the cost of removal of substrings “ab” and “ba” respectively from S, the task is to find the maximum cost of removing all occurrences of substrings “ab” and “ba”.
Examples:
Input: S = “cbbaabbaab”, P = 6, Q = 4
Output: 22
Explanation:
Removing substring “ab” from “cbbaabbaab”, the string obtained is “cbbabaab”. Cost = 6.
Removing substring “ab” from “cbbabaab”, the string obtained is “cbbaab”. Cost = 6.
Removing substring “ba” from “cbbaab”, the string obtained is “cbab”. Cost = 4.
Removing substring “ab” from “cbab“, the string obtained is “cb”. Cost = 6.
Total cost = 6 + 6 + 4 + 6 = 22
Input: S = “bbaanaybbabd”, P = 3, Q = 5
Output: 15
Explanation:
Removing substring “ba” from “bbaanaybbabd”, the string obtained is “banaybbabd”. Cost = 5.
Removing substring “ba”, the string obtained is “banaybbabd”, the string obtained is “naybbabd”. Cost = 5.
Removing substring “ba” from “naybbabd”, the string obtained is “naybbd”. Cost = 5.
Total cost = 5 + 5 + 5 = 15
Approach: The problem can be solved using Greedy technique. Follow the steps below to solve the problem:
- Traverse the string and remove one type of substring. This can be done using greedy approach as:
- If P >= Q, remove all occurrences of “ab” substring and then remove all occurrences of “ba” substring.
- Otherwise, remove all occurrences of “ba” substring and then remove all occurrences of “ab” substring.
- Stack Data Structure can be used
- Initialize our higher cost and lower cost string as “ab” or “ba” according to the value of P and Q as character arrays maxstr[] and minstr[] of size 2 and initialize maximum cost and minimum cost as maxp and minp respectively.
- Initialize variable, say cost, to store maximum cost
- Traverse the string and perform the following steps:
- If stack is not empty and top of stack and the current character forms maxstr[], then pop the stack top and add maxp to cost.
- Otherwise, add the current character to the stack.
- Traverse the remaining string.
- If stack is not empty and top of stack and the current character forms the minstr[], then pop the stack top and add minp to cost.
- Otherwise, add the current character to the stack.
- Print cost as the maximum cost.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int MaxCollection(string S, int P, int Q)
{
char maxstr[2];
string x = (P >= Q ? "ab" : "ba" );
strcpy (maxstr, x.c_str());
char minstr[2];
x = (P >= Q ? "ba" : "ab" );
strcpy (minstr, x.c_str());
int maxp = max(P, Q);
int minp = min(P, Q);
int cost = 0;
stack< char > stack1;
char s[S.length()];
strcpy (s, S.c_str());
for ( auto &ch : s) {
if (!stack1.empty()
&& (stack1.top() == maxstr[0]
&& ch == maxstr[1])) {
stack1.pop();
cost += maxp;
}
else {
stack1.push(ch);
}
}
string sb = "" ;
while (stack1.size() > 0)
{
sb = sb + stack1.top();
stack1.pop();
}
reverse(sb.begin(), sb.end());
for ( auto &ch : sb) {
if (!stack1.empty()
&& (stack1.top() == minstr[0]
&& ch == minstr[1])) {
stack1.pop();
cost += minp;
}
else {
stack1.push(ch);
}
}
return cost;
}
int main()
{
string S = "cbbaabbaab" ;
int P = 6;
int Q = 4;
cout << MaxCollection(S, P, Q);
return 0;
}
|
Java
import java.util.*;
class GFG {
public static int MaxCollection(
String S, int P, int Q)
{
char maxstr[]
= (P >= Q ? "ab" : "ba" ).toCharArray();
char minstr[]
= (P >= Q ? "ba" : "ab" ).toCharArray();
int maxp = Math.max(P, Q);
int minp = Math.min(P, Q);
int cost = 0 ;
Stack<Character> stack1 = new Stack<>();
char [] s = S.toCharArray();
for ( char ch : s) {
if (!stack1.isEmpty()
&& (stack1.peek() == maxstr[ 0 ]
&& ch == maxstr[ 1 ])) {
stack1.pop();
cost += maxp;
}
else {
stack1.push(ch);
}
}
StringBuilder sb = new StringBuilder();
while (!stack1.isEmpty())
sb.append(stack1.pop());
sb = sb.reverse();
String remstr = sb.toString();
for ( char ch : remstr.toCharArray()) {
if (!stack1.isEmpty()
&& (stack1.peek() == minstr[ 0 ]
&& ch == minstr[ 1 ])) {
stack1.pop();
cost += minp;
}
else {
stack1.push(ch);
}
}
return cost;
}
public static void main(String[] args)
{
String S = "cbbaabbaab" ;
int P = 6 ;
int Q = 4 ;
System.out.println(MaxCollection(S, P, Q));
}
}
|
Python3
def MaxCollection(S, P, Q):
maxstr = [i for i in ( "ab" if P > = Q else "ba" )]
minstr = [i for i in ( "ba" if P > = Q else "ab" )]
maxp = max (P, Q)
minp = min (P, Q)
cost = 0
stack1 = []
s = [i for i in S]
for ch in s:
if ( len (stack1)> 0 and (stack1[ - 1 ] = = maxstr[ 0 ] and ch = = maxstr[ 1 ])):
del stack1[ - 1 ]
cost + = maxp
else :
stack1.append(ch)
sb = ""
while ( len (stack1) > 0 ):
sb + = stack1[ - 1 ]
del stack1[ - 1 ]
sb = sb[:: - 1 ]
remstr = sb
for ch in remstr:
if ( len (stack1) > 0 and (stack1[ - 1 ] = = minstr[ 0 ] and ch = = minstr[ 1 ])):
del stack1[ - 1 ]
cost + = minp
else :
stack1.append(ch)
return cost
if __name__ = = '__main__' :
S = "cbbaabbaab"
P = 6 ;
Q = 4 ;
print (MaxCollection(S, P, Q));
|
C#
using System;
using System.Collections;
class GFG {
static int MaxCollection( string S, int P, int Q)
{
char [] maxstr = (P >= Q ? "ab" : "ba" ).ToCharArray();
char [] minstr = (P >= Q ? "ba" : "ab" ).ToCharArray();
int maxp = Math.Max(P, Q);
int minp = Math.Min(P, Q);
int cost = 0;
Stack stack1 = new Stack();
char [] s = S.ToCharArray();
foreach ( char ch in s) {
if (stack1.Count > 0 && (( char )stack1.Peek() == maxstr[0] && ch == maxstr[1])) {
stack1.Pop();
cost += maxp;
}
else {
stack1.Push(ch);
}
}
string sb = "" ;
while (stack1.Count > 0)
{
sb = sb + stack1.Peek();
stack1.Pop();
}
char [] chars = sb.ToCharArray();
Array.Reverse(chars);
string remstr = new string (chars);
foreach ( char ch in remstr.ToCharArray()) {
if (stack1.Count > 0 && (( char )stack1.Peek() == minstr[0] && ch == minstr[1])) {
stack1.Pop();
cost += minp;
}
else {
stack1.Push(ch);
}
}
return cost;
}
static void Main()
{
string S = "cbbaabbaab" ;
int P = 6;
int Q = 4;
Console.Write(MaxCollection(S, P, Q));
}
}
|
Javascript
<script>
function MaxCollection(S,P,Q)
{
let maxstr
= (P >= Q ? "ab" : "ba" ).split( "" );
let minstr
= (P >= Q ? "ba" : "ab" ).split( "" );
let maxp = Math.max(P, Q);
let minp = Math.min(P, Q);
let cost = 0;
let stack1 = [];
let s = S.split( "" );
for (let ch=0;ch< s.length;ch++) {
if (stack1.length!=0
&& (stack1[stack1.length-1] == maxstr[0]
&& s[ch] == maxstr[1])) {
stack1.pop();
cost += maxp;
}
else {
stack1.push(s[ch]);
}
}
let sb = [];
while (stack1.length!=0)
sb.push(stack1.pop());
sb = sb.reverse();
let remstr = sb.join( "" );
for (let ch =0;ch<remstr.length;ch++) {
if (stack1.length!=0
&& (stack1[stack1.length-1] == minstr[0]
&& remstr[ch] == minstr[1])) {
stack1.pop();
cost += minp;
}
else {
stack1.push(remstr[ch]);
}
}
return cost;
}
let S = "cbbaabbaab" ;
let P = 6;
let Q = 4;
document.write(MaxCollection(S, P, Q));
</script>
|
Time Complexity : O(N)
Auxiliary Space : O(N), since N extra space has been taken.
Last Updated :
20 Jul, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...