Skip to content
Related Articles

Related Articles

Modify string by inserting characters such that every K-length substring consists of unique characters only
  • Difficulty Level : Expert
  • Last Updated : 03 Mar, 2021

Given a string S of size N consisting of K distinct characters and (N – K) ‘?’s, the task is to replace all ‘?’ with existing characters from the string such that every substring of size K has consists of unique characters only. If it is not possible to do so, then print “-1”.

Examples:

Input: S = “????abcd”, K = 4
Output: abcdabcd
Explanation:
Replacing the 4 ‘?’s with “abcd” modifies string S to “abcdabcd”, which satisfies the given condition.

Input: S = “?a?b?c”, K = 3
Output: bacbac
Explanation:
Replacing S[0] with ‘b’, S[2] with ‘c’ and S[4] with ‘a’ modifies string S to “bacbac”, which satisfies the given condition.

 

Approach: The idea is based on the observation that in the final resultant string, each character must appear after exactly K places like the (K + 1)th character must be same as 1st, (K + 2)th character must be same as 2nd, and so on.



Follow the steps below to solve the problem:

Below is the implementation of the above approach:

C++




// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to replace all '?'
// characters in a string such
// that the given conditions are satisfied
void fillString(string s, int k)
{
    unordered_map<int, char> mp;
 
    // Traverse the string to Map the
    // characters with respective positions
    for (int i = 0; i < s.size(); i++) {
        if (s[i] != '?') {
            mp[i % k] = s[i];
        }
    }
 
    // Traverse the string again and
    // replace all unknown characters
    for (int i = 0; i < s.size(); i++) {
 
        // If i % k is not found in
        // the Map M, then return -1
        if (mp.find(i % k) == mp.end()) {
 
            cout << -1;
            return;
        }
 
        // Update S[i]
        s[i] = mp[i % k];
    }
 
    // Print the string S
    cout << s;
}
 
// Driver Code
int main()
{
    string S = "????abcd";
    int K = 4;
    fillString(S, K);
 
    return 0;
}

Java




// Java Program to implement
// the above approach
import java.io.*;
import java.util.*;
 
class GFG {
 
    // Function to replace all '?'
    // characters in a string such
    // that the given conditions are satisfied
    static void fillString(String str, int k)
    {
 
        char s[] = str.toCharArray();
 
        HashMap<Integer, Character> mp = new HashMap<>();
 
        // Traverse the string to Map the
        // characters with respective positions
        for (int i = 0; i < s.length; i++) {
            if (s[i] != '?') {
                mp.put(i % k, s[i]);
            }
        }
 
        // Traverse the string again and
        // replace all unknown characters
        for (int i = 0; i < s.length; i++) {
 
            // If i % k is not found in
            // the Map M, then return -1
            if (!mp.containsKey(i % k)) {
                System.out.println(-1);
                return;
            }
 
            // Update S[i]
            s[i] = mp.getOrDefault(i % k, s[i]);
        }
 
        // Print the string S
        System.out.println(new String(s));
    }
 
    // Driver Code
    public static void main(String[] args)
    {
 
        String S = "????abcd";
        int K = 4;
        fillString(S, K);
    }
}
 
// This code is contributed by Kingash.

Python3




# Python 3 program for the above approach
 
# Function to replace all '?'
# characters in a string such
# that the given conditions are satisfied
def fillString(s, k):
    mp = {}
 
    # Traverse the string to Map the
    # characters with respective positions
    for i in range(len(s)):
        if (s[i] != '?'):
            mp[i % k] = s[i]
 
    # Traverse the string again and
    # replace all unknown characters
    s = list(s)
    for i in range(len(s)):
       
        # If i % k is not found in
        # the Map M, then return -1
        if ((i % k) not in mp):
            print(-1)
            return
 
        # Update S[i]
        s[i] = mp[i % k]
 
    # Print the string S
    s =   ''.join(s)
    print(s)
 
# Driver Code
if __name__ == '__main__':
    S = "????abcd"
    K = 4
    fillString(S, K)
 
    # This code is contributed by bgangwar59.

C#




// C# program for the above approach
using System;
using System.Collections.Generic;
 
class GFG
{
 
  // Function to replace all '?'
  // characters in a string such
  // that the given conditions are satisfied
  static void fillString(string str, int k)
  {
 
    char[] s = str.ToCharArray();
 
    Dictionary<int,
    int> mp = new Dictionary<int,
    int>();
 
    // Traverse the string to Map the
    // characters with respective positions
    for (int i = 0; i < s.Length; i++) {
      if (s[i] != '?') {
        mp[i % k] = s[i];
      }
    }
 
    // Traverse the string again and
    // replace all unknown characters
    for (int i = 0; i < s.Length; i++) {
 
      // If i % k is not found in
      // the Map M, then return -1
      if (!mp.ContainsKey(i % k)) {
        Console.WriteLine(-1);
        return;
      }
 
      // Update S[i]
      s[i] = (char)mp[i % k];
 
    }
 
    // Print the string S
    Console.WriteLine(new string(s));
  }
 
  // Driver code
  static void Main()
  {
    string S = "????abcd";
    int K = 4;
    fillString(S, K);
  }
}
 
// This code is contributed by susmitakundugoaldanga.
Output: 
abcdabcd

 

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

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up
Recommended Articles
Page :