Check if a string consists of two K-length non-overlapping substrings as anagrams
Last Updated :
18 Jun, 2021
Given a string str of length N and an integer K, the task is to check if a string has two non-overlapping substrings of length K as anagrams.
Examples:
Input: str = “ginfing”, K = 3
Output: Yes
Explanation:
“gin” and “ing” are the two non overlapping substrings of length 3 which are anagrams.
Therefore, the output is Yes.
Input: str = “ginig”, K = 3
Output: No
Explanation:
In the given string, there are no two non overlapping substrings of length 3 which are anagrams. Note that substring “gin” and substring “nig” are anagrams, but they are overlapping, hence are not considered.
Hence, the output is No.
Approach: The idea to solve this problem is to traverse the given string and use a set to store the substrings of length K and search for two non-overlapping substrings present in the given string. Follow the steps below:
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
void anagramPairs(string str, int K)
{
unordered_set<string> set;
int l = str.length();
for ( int i = 0; i < l; i++) {
if (i > 0 && K - (i - 1) - 1 < l) {
string s1 = str.substr(i - 1, K);
sort(s1.begin(), s1.end());
set.erase(s1);
}
if ((i - 1) - K + 1 >= 0) {
string s1 = str.substr(
(i - 1) - K + 1, K);
sort(s1.begin(), s1.end());
set.insert(s1);
}
if (K + i - 1 < l) {
string s1 = str.substr(i, K);
sort(s1.begin(), s1.end());
if (set.count(s1)) {
cout << "Yes" ;
return ;
}
set.insert(s1);
}
}
cout << "No" ;
}
int main()
{
string str = "ginfing" ;
int K = 3;
anagramPairs(str, K);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static void anagramPairs(String str, int K)
{
HashSet<String> set = new HashSet<String>();
int l = str.length();
for ( int i = 0 ; i < l; i++)
{
if (i > 0 && K - (i - 1 ) - 1 < l)
{
String s1 = str.substring(i - 1 , K);
s1 = sortString(s1);
set.remove(s1);
}
if ((i - 1 ) - K + 1 >= 0 )
{
String s1 = str.substring(
(i - 1 ) - K + 1 , K);
s1 = sortString(s1);
set.add(s1);
}
if (K + i - 1 < l)
{
String s1 = str.substring(i, i+K);
s1 = sortString(s1);
if (set.contains(s1))
{
System.out.print( "Yes" );
return ;
}
set.add(s1);
}
}
System.out.print( "No" );
}
static String sortString(String inputString)
{
char tempArray[] = inputString.toCharArray();
Arrays.sort(tempArray);
return new String(tempArray);
}
public static void main(String[] args)
{
String str = "ginfing" ;
int K = 3 ;
anagramPairs(str, K);
}
}
|
Python3
def anagramPairs( str , K):
sett = {}
l = len ( str )
for i in range (l):
if (i > 0 and K - (i - 1 ) - 1 < l):
s1 = str [i - 1 :i + K - 1 ]
s1 = sorted (s1)
del sett["".join(s1)]
if ((i - 1 ) - K + 1 > = 0 ):
s1 = str [(i - 1 ) - K + 1 :i]
s1 = sorted (s1)
sett["".join(s1)] = 1
if (K + i - 1 < l):
s1 = str [i : i + K]
s1 = sorted (s1)
if "".join(s1) in sett:
print ( "Yes" )
return
sett["".join(s1)] = 1
print ( "No" )
if __name__ = = '__main__' :
str = "ginfing"
K = 3
anagramPairs( str , K)
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static void anagramPairs(String str, int K)
{
HashSet<String> set = new HashSet<String>();
int l = str.Length;
for ( int i = 0; i < l; i++)
{
if (i > 0 && K - (i - 1) - 1 < l)
{
String s1 = str.Substring(i - 1, K);
s1 = sortString(s1);
set .Remove(s1);
}
if ((i - 1) - K + 1 >= 0)
{
String s1 = str.Substring(
(i - 1) - K + 1, K);
s1 = sortString(s1);
set .Add(s1);
}
if (K + i - 1 < l)
{
String s1 = str.Substring(i, K);
s1 = sortString(s1);
if ( set .Contains(s1))
{
Console.Write( "Yes" );
return ;
}
set .Add(s1);
}
}
Console.Write( "No" );
}
static String sortString(String inputString)
{
char []tempArray = inputString.ToCharArray();
Array.Sort(tempArray);
return new String(tempArray);
}
public static void Main(String[] args)
{
String str = "ginfing" ;
int K = 3;
anagramPairs(str, K);
}
}
|
Javascript
<script>
function anagramPairs(str, K) {
let set = new Set();
let l = str.length;
for (let i = 0; i < l; i++) {
if (i > 0 && K - (i - 1) - 1 < l) {
let s1 = str.substr(i - 1, K);
s1 = s1.split( "" ).sort().join( "" )
set. delete (s1);
}
if ((i - 1) - K + 1 >= 0) {
let s1 = str.substr(
(i - 1) - K + 1, K);
s1 = s1.split( "" ).sort().join( "" )
set.add(s1);
}
if (K + i - 1 < l) {
let s1 = str.substr(i, K);
s1 = s1.split( "" ).sort().join( "" )
if (set.has(s1)) {
document.write( "Yes" );
return ;
}
set.add(s1);
}
}
document.write( "No" );
}
let str = "ginfing" ;
let K = 3;
anagramPairs(str, K);
</script>
|
Time Complexity: O(N*(K + K*log K))
Auxiliary Space: O(N)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...