Wednesday, July 3, 2024
HomeData ModellingData Structure & AlgorithmMinimum number of removals required such that no subsequence of length 2...

Minimum number of removals required such that no subsequence of length 2 occurs more than once

Given a string S consisting of N lowercase characters, the task is to modify the given string such that no subsequence of length two repeats in the string by removing minimum number of characters.

Examples:

Input: S = “abcaadbcd”
Output: abcd
Explanation: Removing the characters at indices {2, 3, 4, 5, 6, 7} modifies the string to “abcd”, that contains every subsequence of length 2 exactly once.

Input: S = “cadbcc”
Output: cadbc

Approach: The given problem can be solved based on the observation that the final string can contain only unique characters with the exception that the first character can occur 2 times in the string, one at the start and the other at the end(if possible). Follow the steps below to solve the problem:

  • Initialize an empty string, say ans to store the resultant final string.
  • Initialize a boolean array C[] of size 26 to check if the character is present in the final string or not.
  • Initialize a variable, say pos as 0 to store the index of the last character added to the string, ans.
  • Traverse the given string S and if the current character is not present in ans, then append it to ans, mark it as visited in the array C[], and update the value of pos to i.
  • Iterate over the range [pos + 1, N – 1] using the variable i and if S[i] is equal to S[0], then append it to the final string ans and break out of the loop.
  • After completing the above steps, print the string ans as the result.

Below is the implementation of the above approach:

C++




// C++ program for the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to remove the minimum count
// of characters from the string such
// that no subsequence of length 2 repeats
void RemoveCharacters(string s)
{
    // Initialize the final string
    string ans = "";
 
    // Stores if any character occurs
    // in the final string or not
    bool c[26];
 
    for (int i = 0; i < 26; i++)
        c[i] = 0;
 
    // Store the index of the last
    // character added in the string
    int pos = 0;
 
    // Traverse the string
    for (int i = 0; i < s.size(); i++) {
 
        // Add all the unique
        // characters
        if (c[s[i] - 'a'] == 0) {
            c[s[i] - 'a'] = 1;
            pos = i;
            ans += s[i];
        }
    }
 
    // Check if S[0] appears in the
    // range [pos+1, N-1]
    for (int i = pos + 1;
         i < (int)s.size(); i++) {
 
        // If the characters are the
        // same
        if (s[i] == s[0]) {
            ans += s[i];
            break;
        }
    }
 
    // Print the resultant string
    cout << ans;
}
 
// Driver Code
int main()
{
    string S = "abcaadbcd";
    RemoveCharacters(S);
    return 0;
}


Java




// Java program for the above approach
import java.io.*;
 
class GFG{
 
// Function to remove the minimum count
// of characters from the string such
// that no subsequence of length 2 repeats
static void RemoveCharacters(String s)
{
   
    // Initialize the final string
    String ans = "";
 
    // Stores if any character occurs
    // in the final string or not
    int []c = new int[26];
 
    for (int i = 0; i < 26; i++)
        c[i] = 0;
 
    // Store the index of the last
    // character added in the string
    int pos = 0;
 
    // Traverse the string
    for (int i = 0; i < s.length(); i++) {
 
        // Add all the unique
        // characters
        if (c[(int)s.charAt(i) - 97] == 0) {
            c[(int)s.charAt(i) - 97] = 1;
            pos = i;
            ans += s.charAt(i);
        }
    }
 
    // Check if S[0] appears in the
    // range [pos+1, N-1]
    for (int i = pos + 1;
         i < s.length(); i++) {
 
        // If the characters are the
        // same
        if (s.charAt(i) == s.charAt(0)) {
            ans += s.charAt(i);
            break;
        }
    }
 
    // Print the resultant string
    System.out.println(ans);
}
 
// Driver code
public static void main(String[] args)
{
    String S = "abcaadbcd";
    RemoveCharacters(S);
}
}
 
// This code is contributed by code_hunt.


Python3




# Python 3 program for the above approach
 
# Function to remove the minimum count
# of characters from the string such
# that no subsequence of length 2 repeats
def RemoveCharacters(s):
   
    # Initialize the final string
    ans = ""
 
    # Stores if any character occurs
    # in the final string or not
    c = [0 for i in range(26)]
 
    # Store the index of the last
    # character added in the string
    pos = 0
 
    # Traverse the string
    for i in range(len(s)):
       
        # Add all the unique
        # characters
        if (c[ord(s[i]) - 97] == 0):
            c[ord(s[i]) - 97] = 1
            pos = i
            ans += s[i]
 
    # Check if S[0] appears in the
    # range [pos+1, N-1]
    for i in range(pos + 1, len(s), 1):
       
        # If the characters are the
        # same
        if (s[i] == s[0]):
            ans += s[i]
            break
 
    # Print the resultant string
    print(ans)
 
# Driver Code
if __name__ == '__main__':
    S = "abcaadbcd"
    RemoveCharacters(S)
 
    # This code is contributed by ipg2016107.


C#




// C# program for the above approach
using System;
using System.Collections.Generic;
 
class GFG{
  
// Function to remove the minimum count
// of characters from the string such
// that no subsequence of length 2 repeats
static void RemoveCharacters(string s)
{
   
    // Initialize the final string
    string ans = "";
 
    // Stores if any character occurs
    // in the final string or not
    int []c = new int[26];
 
    for (int i = 0; i < 26; i++)
        c[i] = 0;
 
    // Store the index of the last
    // character added in the string
    int pos = 0;
 
    // Traverse the string
    for (int i = 0; i < s.Length; i++) {
 
        // Add all the unique
        // characters
        if (c[(int)s[i] - 97] == 0) {
            c[(int)s[i] - 97] = 1;
            pos = i;
            ans += s[i];
        }
    }
 
    // Check if S[0] appears in the
    // range [pos+1, N-1]
    for (int i = pos + 1;
         i < s.Length; i++) {
 
        // If the characters are the
        // same
        if (s[i] == s[0]) {
            ans += s[i];
            break;
        }
    }
 
    // Print the resultant string
    Console.Write(ans);
}
 
// Driver Code
public static void Main()
{
    string S = "abcaadbcd";
    RemoveCharacters(S);
}
}
 
// This code is contributed by SURENDRA_GANGWAR.


Javascript




<script>
 
// javascript program for the above approach
 
// Function to remove the minimum count
// of characters from the string such
// that no subsequence of length 2 repeats
function RemoveCharacters(s)
{
    // Initialize the final string
    var ans = "";
 
    // Stores if any character occurs
    // in the final string or not
    var c = new Array(26);
    var i;
    for (i = 0; i < 26; i++)
        c[i] = 0;
 
    // Store the index of the last
    // character added in the string
    var pos = 0;
 
    // Traverse the string
    for (i = 0; i < s.length; i++) {
 
        // Add all the unique
        // characters
        if (c[s[i].charCodeAt() - 97] == 0) {
            c[s[i].charCodeAt() - 97] = 1;
            pos = i;
            ans += s[i];
        }
    }
 
    // Check if S[0] appears in the
    // range [pos+1, N-1]
    for (i = pos + 1;
         i < s.length; i++) {
 
        // If the characters are the
        // same
        if (s[i] == s[0]) {
            ans += s[i];
            break;
        }
    }
 
    // Print the resultant string
    document.write(ans);
}
 
// Driver Code
    var S = "abcaadbcd";
    RemoveCharacters(S);
 
// This code is contributed by bgangwar59.
</script>


Output: 

abcd

 

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

Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

Nango Kalahttps://www.kala.co.za
Experienced Support Engineer with a demonstrated history of working in the information technology and services industry. Skilled in Microsoft Excel, Customer Service, Microsoft Word, Technical Support, and Microsoft Office. Strong information technology professional with a Microsoft Certificate Solutions Expert (Privet Cloud) focused in Information Technology from Broadband Collage Of Technology.
RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments