Generate a String from given Strings P and Q based on the given conditions
Last Updated :
13 Oct, 2022
Given two strings P and Q, the task is to generate a string S satisfying the following conditions:
- Find S such that P is rearranged and Q is a substring in it.
- All the characters before Q in S should be smaller than or equal to the first character in Q and in lexicographic order.
- The rest of the characters should be present after Q in lexicographic order
Note: All characters of Q are always present in P and length of Q is always less than or equal to the length of P.
Examples:
Input : P = "geeksforgeeksfor" Q = "for"
Output : eeeefforggkkorss
Explanation:
The characters 'e' and 'f' are the only characters here which are less than or equal to 'f' (first character of Q).
So, before "for" the string is lexicographically equal to eeeef.
The rest of the characters in P are greater than 'f', so they are placed after "for" in lexicographic order.
Thus, after "for", the string is ggkkorss.
Therefore the output is eeeefforggkkorss.
Input : P = "lexicographical" Q = "gap"
Output : accegaphiillorx
Explanation:
The string accegaphiillorx satisfies the above conditions for string P and Q.
Approach: The idea is to find the frequencies of all the characters in P and Q to solve the problem.
- Maintain an array of frequencies of all the alphabets in P and Q.
- After finding the frequencies, segregate the characters in P according to the first character in Q and add them to the resulting string.
- Return the resulting string at the end.
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 generate a string S from string P
// and Q according to the given conditions
void manipulateStrings(string P, string Q)
{
// Stores the frequencies
int freq[26];
memset(freq, 0, sizeof(freq));
// Counts occurrences of each characters
for (int i = 0; i < P.size(); i++) {
freq[P[i] - 'a']++;
}
// Reduce the count of the character
// which is also present in Q
for (int i = 0; i < Q.size(); i++) {
freq[Q[i] - 'a']--;
}
// Stores the resultant string
string sb = "";
// Index in freq[] to segregate the string
int pos = Q[0] - 'a';
for (int i = 0; i <= pos; i++) {
while (freq[i] > 0) {
char c = (char)('a' + i);
sb += c;
freq[i]--;
}
}
// Add Q to the resulting string
sb += Q;
for (int i = pos + 1; i < 26; i++) {
while (freq[i] > 0) {
char c = (char)('a' + i);
sb += c;
freq[i]--;
}
}
cout << sb << endl;
}
// Driver Code
int main()
{
string P = "geeksforgeeksfor";
string Q = "for";
// Function call
manipulateStrings(P, Q);
}
// This code is contributed by Amit Katiyar
Java
// Java Program to implement
// the above approach
import java.io.*;
import java.lang.*;
import java.util.*;
class GFG {
// Function to generate a string S from string P
// and Q according to the given conditions
public static void manipulateStrings(String P, String Q)
{
// Stores the frequencies
int[] freq = new int[26];
// Counts occurrences of each characters
for (int i = 0; i < P.length(); i++) {
freq[P.charAt(i) - 'a']++;
}
// Reduce the count of the character
// which is also present in Q
for (int i = 0; i < Q.length(); i++) {
freq[Q.charAt(i) - 'a']--;
}
// Stores the resultant string
StringBuilder sb = new StringBuilder();
// Index in freq[] to segregate the string
int pos = Q.charAt(0) - 'a';
for (int i = 0; i <= pos; i++) {
while (freq[i] > 0) {
char c = (char)('a' + i);
sb.append(c);
freq[i]--;
}
}
// Add Q to the resulting string
sb.append(Q);
for (int i = pos + 1; i < 26; i++) {
while (freq[i] > 0) {
char c = (char)('a' + i);
sb.append(c);
freq[i]--;
}
}
System.out.println(sb);
}
// Driver Code
public static void main(String[] args)
{
String P = "geeksforgeeksfor";
String Q = "for";
// Function call
manipulateStrings(P, Q);
}
}
Python3
# Python3 program to implement
# the above approach
# Function to generate a string S
# from string P and Q according to
# the given conditions
def manipulateStrings(P, Q):
# Stores the frequencies
freq = [0 for i in range(26)]
# Counts occurrences of each characters
for i in range(len(P)):
freq[ord(P[i]) - ord('a')] += 1
# Reduce the count of the character
# which is also present in Q
for i in range(len(Q)):
freq[ord(Q[i]) - ord('a')] -= 1
# Stores the resultant string
sb = ""
# Index in freq[] to segregate the string
pos = ord(Q[0]) - ord('a')
for i in range(pos + 1):
while freq[i] > 0:
sb += chr(ord('a') + i)
freq[i] -= 1
# Add Q to the resulting string
sb += Q
for i in range(pos + 1, 26):
while freq[i] > 0:
sb += chr(ord('a') + i)
freq[i] -= 1
print(sb)
# Driver Code
if __name__ == "__main__":
P = "geeksforgeeksfor"
Q = "for"
# Function call
manipulateStrings(P, Q)
# This code is contributed by rutvik_56
C#
// C# Program to implement
// the above approach
using System;
class GFG {
// Function to generate a string S from string P
// and Q according to the given conditions
public static void manipulateStrings(String P, String Q)
{
// Stores the frequencies
int[] freq = new int[26];
// Counts occurrences of each characters
for (int i = 0; i < P.Length; i++) {
freq[P[i] - 'a']++;
}
// Reduce the count of the character
// which is also present in Q
for (int i = 0; i < Q.Length; i++) {
freq[Q[i] - 'a']--;
}
// Stores the resultant string
String sb = "";
// Index in []freq to segregate the string
int pos = Q[0] - 'a';
for (int i = 0; i <= pos; i++) {
while (freq[i] > 0) {
char c = (char)('a' + i);
sb += c;
freq[i]--;
}
}
// Add Q to the resulting string
sb += Q;
for (int i = pos + 1; i < 26; i++) {
while (freq[i] > 0) {
char c = (char)('a' + i);
sb += c;
freq[i]--;
}
}
Console.WriteLine(sb);
}
// Driver Code
public static void Main(String[] args)
{
String P = "geeksforgeeksfor";
String Q = "for";
// Function call
manipulateStrings(P, Q);
}
}
// This code is contributed by Rohit_ranjan
JavaScript
<script>
// JavaScript Program to implement
// the above approach
// Function to generate a string S from string P
// and Q according to the given conditions
function manipulateStrings(P, Q) {
// Stores the frequencies
var freq = new Array(26).fill(0);
// Counts occurrences of each characters
for (var i = 0; i < P.length; i++) {
freq[P[i].charCodeAt(0) - "a".charCodeAt(0)]++;
}
// Reduce the count of the character
// which is also present in Q
for (var i = 0; i < Q.length; i++) {
freq[Q[i].charCodeAt(0) - "a".charCodeAt(0)]--;
}
// Stores the resultant string
var sb = "";
// Index in []freq to segregate the string
var pos = Q[0].charCodeAt(0) - "a".charCodeAt(0);
for (var i = 0; i <= pos; i++) {
while (freq[i] > 0) {
var c = String.fromCharCode("a".charCodeAt(0) + i);
sb += c;
freq[i]--;
}
}
// Add Q to the resulting string
sb += Q;
for (var i = pos + 1; i < 26; i++) {
while (freq[i] > 0) {
var c = String.fromCharCode("a".charCodeAt(0) + i);
sb += c;
freq[i]--;
}
}
document.write(sb);
}
// Driver Code
var P = "geeksforgeeksfor";
var Q = "for";
// Function call
manipulateStrings(P, Q);
</script>
Time Complexity: O(N+M) where N and M are the respective lengths of P and Q.
Auxiliary Space: O(N), using extra space for string sb.
Similar Reads
Check whether given string can be generated after concatenating given strings Given three strings str, A and B. The task is to check whether str = A + B or str = B + A where + denotes concatenation. Examples: Input: str = "GeeksforGeeks", A = "Geeksfo", B = "rGeeks" Output: Yes str = A + B = "Geeksfo" + "rGeeks" = "GeeksforGeeks"Input: str = "Delhicapitals", B = "Delmi", C =
11 min read
Generate a string consisting of characters 'a' and 'b' that satisfy the given conditions Given two integers A and B, the task is to generate and print a string str such that: str must only contain the characters 'a' and 'b'.str has length A + B and the occurrence of the character 'a' is equal to A and the occurrence of character 'b' is equal to BThe sub-strings "aaa" or "bbb" must not o
6 min read
Generate the String of length N according to given conditions Given two integers N and M. Then your task is to output the string let's say S of length N by following given conditions: S must be formed by only the first M smaller case letters of the alphabetical series.The length of LPS (Longest palindromic Substring) in S should be the minimum possible.Example
10 min read
Generate all permutations of a string that follow given constraints Given a string, generate all permutations of it that do not contain 'B' after 'A', i.e., the string should not contain "AB" as a substring. Examples: Input : str = "ABC" Output : ACB, BAC, BCA, CBA Out of 6 permutations of "ABC", 4 follow the given constraint and 2 ("ABC" and "CAB") do not follow. I
11 min read
All possible strings of any length that can be formed from a given string Given a string of distinct characters, print all possible strings of any length that can be formed from given string characters. Examples: Input: abcOutput: a b c abc ab ac bc bac bca cb ca ba cab cba acbInput: abcdOutput: a b ab ba c ac ca bc cb abc acb bac bca cab cba d ad da bd db abd adb bad bda
10 min read
Find the rank of a given combination from an Array of String Given an array of string and a string K, the task is to find the rank of the given string if we generate all the combinations of the given array of strings. Examples: Input: string = ['ab', 'pq', 'nm'], K = 'pqnm'Output: 7Explanation: All combination generated are :-'' -------------------> rank 1
9 min read