Open In App

Smallest string which not a subsequence of the given string

Last Updated : 09 Jun, 2021
Comments
Improve
Suggest changes
Like Article
Like
Report

Given a string str, consisting of lowercase alphabets, the task is to find the shortest string which is not a subsequence of the given string. If multiple strings exist, then print any one of them.

Examples:

Input: str = "abaabcc" 
Output:
Explanation: 
One of the possible shortest string which is not a subsequence of the given string is "d". Therefore, the required output is "d". 

Input: str = "abcdefghijklmnopqrstuvwxyzaabbccdd" 
Output: ze 

Approach: The problem can be solved using Greedy technique. Follow the steps below to solve the problem:

Below is the implementation of the above approach:

C++
// C++ program to implement
// the above approach

#include <bits/stdc++.h>
using namespace std;

// Function to find shortest string which
// not a subsequence of the given string
string ShortestSubsequenceNotPresent(string str)
{

    // Stores the shortest string which is
    // not a subsequence of the given string
    string shortestString;

    // Stores length of string
    int N = str.length();

    // Stores distinct character of subsegments
    unordered_set<char> subsegments;

    // Traverse the given string
    for (int i = 0; i < N; i++) {

        // Insert current character
        // into subsegments
        subsegments.insert(str[i]);

        // If all lowercase alphabets
        // present in the subsegment
        if (subsegments.size() == 26) {

            // Insert the last character of
            // subsegment into shortestString
            shortestString.push_back(str[i]);

            // Remove all elements from
            // the current subsegment
            subsegments.clear();
        }
    }

    // Traverse all lowercase alphabets
    for (char ch = 'a'; ch <= 'z'; ch++) {

        // If current character is not
        // present in the subsegment
        if (subsegments.count(ch) == 0) {
            shortestString.push_back(ch);

            // Return shortestString
            return shortestString;
        }
    }
    return shortestString;
}

// Driver Code
int main()
{

    // Given String
    string str
        = "abcdefghijklmnopqrstuvwxyzaabbccdd";

    cout << ShortestSubsequenceNotPresent(str);
    return 0;
}
Java
// Java program to implement
// the above approach

import java.io.*;
import java.util.*;

class GFG {
    public static String
    ShortestSubsequenceNotPresent(String str)
    {
        // Stores the shortest string which is
        // not a subsequence of the given string
        String shortestString = "";

        // Stores length of string
        int N = str.length();

        // Stores distinct character of subsegments
        HashSet<Character> subsegments = new HashSet<>();

        // Traverse the given string
        for (int i = 0; i < N; i++) {

            // Insert current character
            // into subsegments
            subsegments.add(str.charAt(i));

            // If all lowercase alphabets
            // present in the subsegment
            if (subsegments.size() == 26) {

                // Insert the last character of
                // subsegment into shortestString
                shortestString
                    = shortestString + str.charAt(i);

                // Remove all elements from
                // the current subsegment
                subsegments.clear();
            }
        }

        // Traverse all lowercase alphabets
        for (char ch = 'a'; ch <= 'z'; ch++) {

            // If current character is not
            // present in the subsegment
            if (!subsegments.contains(ch)) {
                shortestString = shortestString + ch;

                // Return shortestString
                return shortestString;
            }
        }
        return shortestString;
    }

    // Driver Code
    public static void main(String[] args)
    {
        String str = "abcdefghijklmnopqrstuvwxyzaabbccdd";

        System.out.print(
            ShortestSubsequenceNotPresent(str));
    }
}
// This code is contributed by Manu Pathria
Python3
# Python3 program to implement
# the above approach

# Function to find shortest string which
# not a subsequence of the given string
def ShortestSubsequenceNotPresent(Str):

    # Stores the shortest string which is
    # not a subsequence of the given string
    shortestString = ""

    # Stores length of string
    N = len(Str)

    # Stores distinct character of subsegments
    subsegments = set()

    # Traverse the given string
    for i in range(N):

        # Insert current character
        # into subsegments
        subsegments.add(Str[i])

        # If all lowercase alphabets
        # present in the subsegment
        if (len(subsegments) == 26) :

            # Insert the last character of
            # subsegment into shortestString
            shortestString += Str[i]

            # Remove all elements from
            # the current subsegment
            subsegments.clear()
        
    # Traverse all lowercase alphabets
    for ch in range(int(26)):
        
        # If current character is not
        # present in the subsegment
        if (chr(ch + 97) not in subsegments) :
            
            shortestString += chr(ch + 97)
            
            # Return shortestString
            return shortestString
    
    return shortestString

# Driver code
# Given String
Str = "abcdefghijklmnopqrstuvwxyzaabbccdd"

print(ShortestSubsequenceNotPresent(Str))

# This code is contributed by divyeshrabadiya07
C#
// C# program to implement
// the above approach
using System;
using System.Collections.Generic;

class GFG{
    
public static String ShortestSubsequenceNotPresent(
    String str)
{
    
    // Stores the shortest string which is
    // not a subsequence of the given string
    String shortestString = "";

    // Stores length of string
    int N = str.Length;

    // Stores distinct character of subsegments
    HashSet<char> subsegments = new HashSet<char>();

    // Traverse the given string
    for(int i = 0; i < N; i++)
    {
        
        // Insert current character
        // into subsegments
        subsegments.Add(str[i]);

        // If all lowercase alphabets
        // present in the subsegment
        if (subsegments.Count == 26)
        {
            
            // Insert the last character of
            // subsegment into shortestString
            shortestString = shortestString + str[i];
            
            // Remove all elements from
            // the current subsegment
            subsegments.Clear();
        }
    }

    // Traverse all lowercase alphabets
    for(char ch = 'a'; ch <= 'z'; ch++) 
    {
        
        // If current character is not
        // present in the subsegment
        if (!subsegments.Contains(ch))
        {
            shortestString = shortestString + ch;
            
            // Return shortestString
            return shortestString;
        }
    }
    return shortestString;
}

// Driver Code
public static void Main(String[] args)
{
    String str = "abcdefghijklmnopqrstuvwxyzaabbccdd";
    
    Console.Write(
        ShortestSubsequenceNotPresent(str));
}
}

// This code is contributed by Rajput-Ji 
JavaScript
<script>


// JavaScript program to implement
// the above approach


// Function to find shortest string which
// not a subsequence of the given string
function ShortestSubsequenceNotPresent(str)
{

    // Stores the shortest string which is
    // not a subsequence of the given string
    var shortestString = [];

    // Stores length of string
    var N = str.length;

    // Stores distinct character of subsegments
    var subsegments = new Set();

    // Traverse the given string
    for (var i = 0; i < N; i++) {

        // Insert current character
        // into subsegments
        subsegments.add(str[i].charCodeAt(0));

        // If all lowercase alphabets
        // present in the subsegment
        if (subsegments.size == 26) {

            // Insert the last character of
            // subsegment into shortestString
            shortestString.push(str[i]);

            // Remove all elements from
            // the current subsegment
            subsegments = new Set();
        }
    }

    // Traverse all lowercase alphabets
    for (var ch = 'a'.charCodeAt(0);
    ch <= 'z'.charCodeAt(0); ch++) {

        // If current character is not
        // present in the subsegment
        if (!subsegments.has(ch)) {
            shortestString.push(String.fromCharCode(ch));

            // Return shortestString
            return shortestString.join("");
        }
    }
    return shortestString.join("");
}

// Driver Code

// Given String
var str = "abcdefghijklmnopqrstuvwxyzaabbccdd";

document.write( ShortestSubsequenceNotPresent(str));


</script> 

Output
ze

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


Next Article

Similar Reads