Kth non-overlapping Substring of length M after sorting given String lexicographically
Last Updated :
23 Feb, 2023
Given string str of size N and two integers M and K (N is divisible by M), the task is to find the Kth non-overlapping substring of size M after sorting the given string lexicographically
Examples:
Input: str = “hwnriw”, M = 3, K = 1
Output: hin
Explanation: Non overlapping substrings of size 3 after sorting are “hin” “rww”.
So 1st string is “hin” .
Input: str = “xeabcks”, M = 3, K = 1
Output: abc
Naive Approach: The basic idea to solve the problem is to Sort the entire string and after that find the Kth non-overlapping substring which starts from the index (K-1)*M.
Follow the below steps to solve the problem:
- Sort the entire string.
- Get the starting index of the Kth substring as mentioned below.
- And after that take the substring of size M from that index.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
string getKthString( int N, int M, int K,
string str)
{
sort(str.begin(), str.end());
int startingIndex = (K - 1) * M;
string kthString = "" ;
int size = 0;
for ( int i = startingIndex;
i < N && size < M; i++) {
kthString += str[i];
size++;
}
return kthString;
}
int main()
{
int N = 6;
int M = 3;
int K = 1;
string str = "xeabcks" ;
cout << getKthString(N, M, K, str);
return 0;
}
|
Java
import java.io.*;
import java.util.*;
class GFG
{
public static String getKthString( int N, int M, int K,
String str)
{
char tempArray[] = str.toCharArray();
Arrays.sort(tempArray);
str = new String(tempArray);
int startingIndex = (K - 1 ) * M;
String kthString = "" ;
int size = 0 ;
for ( int i = startingIndex; i < N && size < M;
i++) {
kthString += str.charAt(i);
size++;
}
return kthString;
}
public static void main(String[] args)
{
int N = 6 ;
int M = 3 ;
int K = 1 ;
String str = "xeabcks" ;
System.out.print(getKthString(N, M, K, str));
}
}
|
Python3
def getKthString(N, M, K, str ):
str = "".join( sorted ( list ( str )))
startingIndex = (K - 1 ) * M
kthString = ""
size = 0
i = startingIndex
while (i < N and size < M):
kthString + = str [i]
size + = 1
i + = 1
return kthString
N = 6
M = 3
K = 1
str = "xeabcks"
print (getKthString(N, M, K, str ))
|
C#
using System;
class GFG {
static String getKthString( int N, int M, int K,
string str)
{
char [] tempArray = new char [str.Length];
for ( int i = 0; i < str.Length; i++) {
tempArray[i] = str[i];
}
Array.Sort(tempArray);
str = new string (tempArray);
int startingIndex = (K - 1) * M;
string kthString = "" ;
int size = 0;
for ( int i = startingIndex; i < N && size < M;
i++) {
kthString += str[i];
size++;
}
return kthString;
}
public static int Main()
{
int N = 6;
int M = 3;
int K = 1;
string str = "xeabcks" ;
Console.Write(getKthString(N, M, K, str));
return 0;
}
}
|
Javascript
<script>
function getKthstring(N, M, K, str)
{
str = [...str];
str.sort();
int startingIndex = (K - 1) * M;
int kthstring = "" ;
int size = 0;
for (int i = startingIndex; i < N && size < M;
i++) {
kthstring += str[i];
size++;
}
return kthstring;
}
let N = 6;
let M = 3;
let K = 1;
let str = "xeabcks" ;
document.write(getKthstring(N, M, K, str));
</script>
|
Time Complexity: O(N * Log N)
Auxiliary Space: O(1)
Efficient Approach: The problem can be solved efficiently using hashing and prefix sum based on the following idea:
There are total (K-1)*M characters before the starting character of the Kth substring.
So store the frequency of all the characters. Then iterate from the smallest character present in the string and with the help of prefix sum find the first character of the Kth substring.
This will help solve the problem in linear time complexity.
C++
#include <bits/stdc++.h>
using namespace std;
string getKthString( int N, int M, int K, string str)
{
int a[26] = { 0 };
for ( int i = 0; i < N; i++) {
a[str[i] - 'a' ]++;
}
int prefix[26];
prefix[0] = a[0];
for ( int i = 1; i < 26; i++) {
prefix[i] = prefix[i - 1] + a[i];
}
int startingIndex = (K - 1) * M;
int var = 0;
int size = 0;
string kthString = "" ;
for ( int i = 0; i < 26; i++) {
if (prefix[i] < startingIndex || a[i] == 0) {
continue ;
}
else if (var == 0) {
var = prefix[i] - startingIndex;
for ( int j = 0; j < var; j++) {
kthString += char (97 + i);
size++;
if (size == M)
break ;
}
}
else {
for ( int j = 0; j < prefix[i] - prefix[i - 1];
j++) {
kthString += char (97 + i);
size++;
if (size == M)
break ;
}
}
if (size == M)
break ;
}
return kthString;
}
int main()
{
int N = 6;
int M = 3;
int K = 1;
string str = "xeabck" ;
cout << getKthString(N, M, K, str);
return 0;
}
|
Java
import java.io.*;
class GFG {
public static String getKthString( int N, int M, int K,
String str)
{
int [] a = new int [ 26 ];
for ( int i = 0 ; i < N; i++) {
a[str.charAt(i) - 'a' ]++;
}
int [] prefix = new int [ 26 ];
prefix[ 0 ] = a[ 0 ];
for ( int i = 1 ; i < 26 ; i++) {
prefix[i] = prefix[i - 1 ] + a[i];
}
int startingIndex = (K - 1 ) * M;
int var = 0 ;
int size = 0 ;
String kthString = "" ;
for ( int i = 0 ; i < 26 ; i++) {
if (prefix[i] < startingIndex || a[i] == 0 ) {
continue ;
}
else if (var == 0 ) {
var = prefix[i] - startingIndex;
for ( int j = 0 ; j < var; j++) {
kthString += ( char )( 97 + i);
size++;
if (size == M)
break ;
}
}
else {
for ( int j = 0 ;
j < prefix[i] - prefix[i - 1 ]; j++) {
kthString += ( char )( 97 + i);
size++;
if (size == M)
break ;
}
}
if (size == M)
break ;
}
return kthString;
}
public static void main(String[] args)
{
int N = 6 ;
int M = 3 ;
int K = 1 ;
String str = "xeabck" ;
System.out.println(getKthString(N, M, K, str));
}
}
|
Python3
def getKthString(N, M, K, str ):
a = [ 0 ] * 26
for i in range (N):
a[ ord ( str [i]) - ord ( 'a' )] + = 1
prefix = [ 0 ] * 26
prefix[ 0 ] = a[ 0 ]
for i in range ( 1 , 26 ):
prefix[i] = prefix[i - 1 ] + a[i]
startingIndex = (K - 1 ) * M
var = 0
size = 0
kthString = ""
for i in range ( 26 ):
if (prefix[i] < startingIndex or a[i] = = 0 ):
continue
elif (var = = 0 ):
var = prefix[i] - startingIndex;
for j in range (var):
kthString + = chr ( 97 + i)
size + = 1
if (size = = M):
break
else :
for j in range (prefix[i] - prefix[i - 1 ]):
kthString + = chr ( 97 + i);
size + = 1
if (size = = M):
break
if (size = = M):
break
return kthString
if __name__ = = '__main__' :
N = 6 ;
M = 3
K = 1
string = "xeabck"
print (getKthString(N, M, K, string))
|
C#
using System;
using System.Collections;
using System.Collections.Generic;
class GFG
{
public static String getKthString( int N, int M, int K,
String str)
{
int [] a = new int [26];
for ( int i = 0; i < N; i++) {
a[( int )str[i] - ( int )( 'a' )]++;
}
int [] prefix = new int [26];
prefix[0] = a[0];
for ( int i = 1 ; i < 26 ; i++) {
prefix[i] = prefix[i - 1] + a[i];
}
int startingIndex = (K - 1) * M;
int var = 0;
int size = 0;
String kthString = "" ;
for ( int i = 0 ; i < 26 ; i++) {
if (prefix[i] < startingIndex || a[i] == 0) {
continue ;
}
else if ( var == 0) {
var = prefix[i] - startingIndex;
for ( int j = 0 ; j < var ; j++) {
kthString += ( char )(97 + i);
size++;
if (size == M){
break ;
}
}
}
else {
for ( int j = 0 ; j < prefix[i] - prefix[i - 1] ; j++) {
kthString += ( char )(97 + i);
size++;
if (size == M){
break ;
}
}
}
if (size == M){
break ;
}
}
return kthString;
}
public static void Main( string [] args)
{
int N = 6;
int M = 3;
int K = 1;
String str = "xeabck" ;
Console.WriteLine(getKthString(N, M, K, str));
}
}
|
Javascript
function getKthString(N, M, K, str)
{
let a = new Array(26).fill(0);
for ( var i = 0; i < N; i++)
a[str[i].charCodeAt(0) - 'a' .charCodeAt(0)]++;
let prefix = new Array(26).fill(0);
prefix[0] = a[0];
for ( var i = 1; i < 26; i++)
prefix[i] = prefix[i - 1] + a[i];
let startingIndex = (K - 1) * M;
let var_ = 0;
let size = 0;
let kthString = "" ;
for ( var i = 0; i < 26; i++)
{
if (prefix[i] < startingIndex || a[i] == 0)
continue ;
else if (var_ == 0)
{
var_ = prefix[i] - startingIndex;
for ( var j = 0; j < var_; j++)
{
kthString += String.fromCharCode(97 + i);
size += 1;
if (size == M)
break ;
}
}
else
{
for ( var j = 0; j < (prefix[i] - prefix[i - 1]); j++)
{
kthString += String.fromCharCode(97 + i);
size += 1;
if (size == M)
break ;
}
}
if (size == M)
break
}
return kthString;
}
let N = 6;
let M = 3;
let K = 1;
let string = "xeabck" ;
console.log(getKthString(N, M, K, string));
|
Time Complexity: O(N)
Auxiliary Space: O(N)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...