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++
#include <bits/stdc++.h>
using namespace std;
void manipulateStrings(string P, string Q)
{
int freq[26];
memset (freq, 0, sizeof (freq));
for ( int i = 0; i < P.size(); i++) {
freq[P[i] - 'a' ]++;
}
for ( int i = 0; i < Q.size(); i++) {
freq[Q[i] - 'a' ]--;
}
string sb = "" ;
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]--;
}
}
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;
}
int main()
{
string P = "geeksforgeeksfor" ;
string Q = "for" ;
manipulateStrings(P, Q);
}
|
Java
import java.io.*;
import java.lang.*;
import java.util.*;
class GFG {
public static void manipulateStrings(String P, String Q)
{
int [] freq = new int [ 26 ];
for ( int i = 0 ; i < P.length(); i++) {
freq[P.charAt(i) - 'a' ]++;
}
for ( int i = 0 ; i < Q.length(); i++) {
freq[Q.charAt(i) - 'a' ]--;
}
StringBuilder sb = new StringBuilder();
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]--;
}
}
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);
}
public static void main(String[] args)
{
String P = "geeksforgeeksfor" ;
String Q = "for" ;
manipulateStrings(P, Q);
}
}
|
Python3
def manipulateStrings(P, Q):
freq = [ 0 for i in range ( 26 )]
for i in range ( len (P)):
freq[ ord (P[i]) - ord ( 'a' )] + = 1
for i in range ( len (Q)):
freq[ ord (Q[i]) - ord ( 'a' )] - = 1
sb = ""
pos = ord (Q[ 0 ]) - ord ( 'a' )
for i in range (pos + 1 ):
while freq[i] > 0 :
sb + = chr ( ord ( 'a' ) + i)
freq[i] - = 1
sb + = Q
for i in range (pos + 1 , 26 ):
while freq[i] > 0 :
sb + = chr ( ord ( 'a' ) + i)
freq[i] - = 1
print (sb)
if __name__ = = "__main__" :
P = "geeksforgeeksfor"
Q = "for"
manipulateStrings(P, Q)
|
C#
using System;
class GFG {
public static void manipulateStrings(String P, String Q)
{
int [] freq = new int [26];
for ( int i = 0; i < P.Length; i++) {
freq[P[i] - 'a' ]++;
}
for ( int i = 0; i < Q.Length; i++) {
freq[Q[i] - 'a' ]--;
}
String sb = "" ;
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]--;
}
}
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);
}
public static void Main(String[] args)
{
String P = "geeksforgeeksfor" ;
String Q = "for" ;
manipulateStrings(P, Q);
}
}
|
Javascript
<script>
function manipulateStrings(P, Q) {
var freq = new Array(26).fill(0);
for ( var i = 0; i < P.length; i++) {
freq[P[i].charCodeAt(0) - "a" .charCodeAt(0)]++;
}
for ( var i = 0; i < Q.length; i++) {
freq[Q[i].charCodeAt(0) - "a" .charCodeAt(0)]--;
}
var sb = "" ;
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]--;
}
}
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);
}
var P = "geeksforgeeksfor" ;
var Q = "for" ;
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.
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...