Open In App

Minimize the cost to convert given string to either type XYXY… or XXYY…

Last Updated : 09 Feb, 2022
Improve
Improve
Like Article
Like
Save
Share
Report

Given a binary string s and an array ct[] of even size. The task is to minimize the cost of operations to:

  • Convert string s to a string of either type XYXYXYXYXY… or XXYYXXYYXXYY
  • In one operation it is allowed to flip ith character with cost ct[i].

Examples

Input: s = “1011” ct = {1, 2, 1, 3}
Output: 1
Explanation: Follow operations are performed to convert s to given format:
Flip the 0th bit from 1 to 0, the updated s = “0011” which is in the form XXYY. 
Hence, 1 is the answer which is minimum possible.

Input: “1010”
Output: 0
Explanation: The string is already in a given format. 

 

Approach: This problem is observation-based. Follow the steps below to solve the given problem.

  • There are only four types of binary strings, according to the problem.
    • 010101010101…….
    • 101010101010…….
    • 001100110011……..
    • 110011001100……..
  • We have to check for these four different strings only.
  • Pass the string along with cost and the first four expected characters.
  • If the expected characters do not match with the string’s actual characters then add the cost corresponding to the ith value.
  • Repeat the procedure for all four expected sequences and choose the minimum cost out of it.

Below is the implementation of the above approach:

C++




// C++ program for above approach
#include <bits/stdc++.h>
using namespace std;
 
int solve_util(string s, int c[],
               char x, char y,
               char z, char w)
{
    int ans = 0;
    for (int i = 0; i < s.length(); i += 4) {
        if (s[i] != x)
            ans += c[i];
        if (i + 1 < s.length()
            && s[i + 1] != y)
            ans += c[i + 1];
        if (i + 2 < s.length()
            && s[i + 2] != z)
            ans += c[i + 2];
        if (i + 3 < s.length()
            && s[i + 3] != w)
            ans += c[i + 3];
    }
    return ans;
}
 
int solve_util2(string s, int c[],
                char x, char y)
{
    int ans = 0;
    if (s[0] != x)
        ans += c[0];
    if (s[1] != y)
        ans += c[1];
    return ans;
}
 
// Function to convert given
// string to required form
int minOperations(int N, string S, int C[])
{
    // code here
    if (S.length() == 2) {
        int x = solve_util2(
            S, C, '0', '1');
        int y = solve_util2(
            S, C, '1', '0');
        int z = solve_util2(
            S, C, '1', '1');
        int w = solve_util2(
            S, C, '0', '0');
        return min({ x, y, z, w });
    }
    int x = solve_util(
        S, C, '0', '1', '0', '1');
    int y = solve_util(
        S, C, '1', '0', '1', '0');
    int z = solve_util(
        S, C, '1', '1', '0', '0');
    int w = solve_util(
        S, C, '0', '0', '1', '1');
    return min({ x, y, z, w });
}
 
// Driver Code
int main()
{
    int N = 4;
    string s = "1011";
    int ct[] = { 1, 2, 1, 3 };
 
    cout << minOperations(N, s, ct) << "\n";
    return 0;
}


Java




// Java program for the above approach
import java.io.*;
import java.lang.*;
import java.util.*;
 
class GFG {
 
 
  static int solve_util(char s[], int c[],
                        char x, char y,
                        char z, char w)
  {
    int ans = 0;
    for (int i = 0; i < s.length; i += 4) {
      if (s[i] != x)
        ans += c[i];
      if (i + 1 < s.length
          && s[i + 1] != y)
        ans += c[i + 1];
      if (i + 2 < s.length
          && s[i + 2] != z)
        ans += c[i + 2];
      if (i + 3 < s.length
          && s[i + 3] != w)
        ans += c[i + 3];
    }
    return ans;
  }
 
  static int solve_util2(char s[], int c[],
                         char x, char y)
  {
    int ans = 0;
    if (s[0] != x)
      ans += c[0];
    if (s[1] != y)
      ans += c[1];
    return ans;
  }
 
  // Function to convert given
  // string to required form
  static int minOperations(int N, char S[], int C[])
  {
    // code here
    if (S.length == 2) {
      int x = solve_util2(
        S, C, '0', '1');
      int y = solve_util2(
        S, C, '1', '0');
      int z = solve_util2(
        S, C, '1', '1');
      int w = solve_util2(
        S, C, '0', '0');
      return Math.min(x, Math.min( y, Math.min(z, w )));
    }
    int x = solve_util(
      S, C, '0', '1', '0', '1');
    int y = solve_util(
      S, C, '1', '0', '1', '0');
    int z = solve_util(
      S, C, '1', '1', '0', '0');
    int w = solve_util(
      S, C, '0', '0', '1', '1');
    return Math.min(x, Math.min( y, Math.min(z, w )));
  }
 
  // Driver Code
  public static void main (String[] args) {
    int N = 4;
    char s[] = {'1', '0', '1', '1'};
    int ct[] = { 1, 2, 1, 3 };
 
    System.out.print(minOperations(N, s, ct));
  }
}
 
// This code is contributed by hrithikgarg03188.


Python3




# Python program for above approach
def solve_util(s, c, x, y, z, w):
    ans = 0
    for i in range(0, len(s), 4):
        if (s[i] != x):
            ans += c[i]
        if (i + 1 < len(s)
                and s[i + 1] != y):
            ans += c[i + 1]
        if (i + 2 < len(s)
                and s[i + 2] != z):
            ans += c[i + 2]
        if (i + 3 < len(s)
                and s[i + 3] != w):
            ans += c[i + 3]
 
    return ans
 
def solve_util2(s, c, x, y):
    ans = 0
    if (s[0] != x):
        ans += c[0]
    if (s[1] != y):
        ans += c[1]
    return ans
 
# Function to convert given
# string to required form
def minOperations(N, S, C):
 
    # code here
    if (len(S) == 2):
        x = solve_util2(S, C, '0', '1')
        y = solve_util2(S, C, '1', '0')
        z = solve_util2(S, C, '1', '1')
        w = solve_util2(S, C, '0', '0')
        print(f"{x},{y},{z},{w}")
        return min([x, y, z, w])
 
    x = solve_util(S, C, '0', '1', '0', '1')
    y = solve_util(S, C, '1', '0', '1', '0')
    z = solve_util(S, C, '1', '1', '0', '0')
    w = solve_util(S, C, '0', '0', '1', '1')
 
    return min([x, y, z, w])
 
# Driver Code
N = 4
s = "1011"
ct = [1, 2, 1, 3]
 
print(minOperations(N, s, ct))
 
# This code is contributed by gfgking


C#




// C# program for the above approach
using System;
class GFG
{
 
  static int solve_util(char []s, int []c,
                        char x, char y,
                        char z, char w)
  {
    int ans = 0;
    for (int i = 0; i < s.Length; i += 4) {
      if (s[i] != x)
        ans += c[i];
      if (i + 1 < s.Length
          && s[i + 1] != y)
        ans += c[i + 1];
      if (i + 2 < s.Length
          && s[i + 2] != z)
        ans += c[i + 2];
      if (i + 3 < s.Length
          && s[i + 3] != w)
        ans += c[i + 3];
    }
    return ans;
  }
 
  static int solve_util2(char []s, int []c,
                         char x, char y)
  {
    int ans = 0;
    if (s[0] != x)
      ans += c[0];
    if (s[1] != y)
      ans += c[1];
    return ans;
  }
 
  // Function to convert given
  // string to required form
  static int minOperations(int N, char []S, int []C)
  {
    // code here
    if (S.Length == 2) {
      int x = solve_util2(
        S, C, '0', '1');
      int y = solve_util2(
        S, C, '1', '0');
      int z = solve_util2(
        S, C, '1', '1');
      int w = solve_util2(
        S, C, '0', '0');
      return Math.Min(x, Math.Min( y, Math.Min(z, w )));
    }
     
    else {
      int x = solve_util(
        S, C, '0', '1', '0', '1');
      int y = solve_util(
        S, C, '1', '0', '1', '0');
      int z = solve_util(
        S, C, '1', '1', '0', '0');
      int w = solve_util(
        S, C, '0', '0', '1', '1');
      return Math.Min(x, Math.Min( y, Math.Min(z, w )));
    }
  }
 
  // Driver Code
  public static void Main () {
    int N = 4;
    char []s = {'1', '0', '1', '1'};
    int []ct = { 1, 2, 1, 3 };
 
    Console.Write(minOperations(N, s, ct));
  }
}
 
// This code is contributed by Samim Hossain Mondal.


Javascript




<script>
    // JavaScript program for above approach
 
    const solve_util = (s, c, x, y, z, w) => {
        let ans = 0;
        for (let i = 0; i < s.length; i += 4) {
            if (s[i] != x)
                ans += c[i];
            if (i + 1 < s.length
                && s[i + 1] != y)
                ans += c[i + 1];
            if (i + 2 < s.length
                && s[i + 2] != z)
                ans += c[i + 2];
            if (i + 3 < s.length
                && s[i + 3] != w)
                ans += c[i + 3];
        }
        return ans;
    }
 
    const solve_util2 = (s, c, x, y) => {
        let ans = 0;
        if (s[0] != x)
            ans += c[0];
        if (s[1] != y)
            ans += c[1];
        return ans;
    }
 
    // Function to convert given
    // string to required form
    const minOperations = (N, S, C) => {
     
        // code here
        if (S.length == 2) {
            let x = solve_util2(S, C, '0', '1');
            let y = solve_util2(S, C, '1', '0');
            let z = solve_util2(S, C, '1', '1');
            let w = solve_util2(S, C, '0', '0');
            document.write(`${x},${y},${z},${w}`);
            return Math.min(...[x, y, z, w]);
        }
        let x = solve_util(S, C, '0', '1', '0', '1');
        let y = solve_util(S, C, '1', '0', '1', '0');
        let z = solve_util(S, C, '1', '1', '0', '0');
        let w = solve_util(S, C, '0', '0', '1', '1');
 
        return Math.min(...[x, y, z, w]);
    }
 
    // Driver Code
    let N = 4;
    let s = "1011";
    let ct = [1, 2, 1, 3];
 
    document.write(minOperations(N, s, ct));
 
    // This code is contributed by rakeshsahni
 
</script>


 
 

Output

1

 

Time Complexity: O(N)
Auxiliary Space: O(1)

 



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads