Check if a string contains an anagram of another string as its substring
Last Updated :
03 Jun, 2021
Given two strings S1 and S2, the task is to check if S2 contains an anagram of S1 as its substring.
Examples:
Input: S1 = “ab”, S2 = “bbpobac”
Output: Yes
Explanation: String S2 contains anagram “ba” of S1 (“ba”).
Input: S1 = “ab”, S2 = “cbddaoo”
Output: No
Approach: Follow the steps below to solve the problem:
- Initialize two Hashmaps s1hash and s2hash, to store the frequency of alphabets of the two strings.
- If the length of S1 is greater than the length of S2, then print “NO”.
- Iterate over the characters of the string S1 and update s1hash.
- Iterate over the characters of the string S2 using the Sliding Window technique and update the HashMap accordingly.
- For any substring of S2 of length equal to the length of S1, if both the Hashmaps are found to be equal, print “YES”.
- Otherwise, print “NO”.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
bool checkAnagram(string s1, string s2)
{
vector< int > s2hash(26, 0);
vector< int > s1hash(26, 0);
int s1len = s1.size();
int s2len = s2.size();
if (s1len > s2len)
return false ;
int left = 0, right = 0;
while (right < s1len) {
s1hash[s1[right] - 'a' ] += 1;
s2hash[s2[right] - 'a' ] += 1;
right++;
}
right -= 1;
while (right < s2len) {
if (s1hash == s2hash)
return true ;
right++;
if (right != s2len)
s2hash[s2[right] - 'a' ] += 1;
s2hash[s2[left] - 'a' ] -= 1;
left++;
}
return false ;
}
int main()
{
string s1 = "ab" ;
string s2 = "bbpobac" ;
if (checkAnagram(s1, s2))
cout << "YES\n" ;
else
cout << "No\n" ;
return 0;
}
|
Java
import java.io.*;
import java.util.*;
class GFG
{
public static boolean checkAnagram(String s1, String s2)
{
int s2hash[] = new int [ 26 ];
int s1hash[] = new int [ 26 ];
int s1len = s1.length();
int s2len = s2.length();
if (s1len > s2len)
return false ;
int left = 0 , right = 0 ;
while (right < s1len)
{
s1hash[s1.charAt(right) - 'a' ] += 1 ;
s2hash[s2.charAt(right) - 'a' ] += 1 ;
right++;
}
right -= 1 ;
while (right < s2len) {
if (Arrays.equals(s1hash, s2hash))
return true ;
right++;
if (right != s2len)
s2hash[s2.charAt(right) - 'a' ] += 1 ;
s2hash[s2.charAt(left) - 'a' ] -= 1 ;
left++;
}
return false ;
}
public static void main(String[] args)
{
String s1 = "ab" ;
String s2 = "bbpobac" ;
if (checkAnagram(s1, s2))
System.out.println( "YES" );
else
System.out.println( "No" );
}
}
|
Python3
def checkAnagram(s1, s2):
s2hash = [ 0 for i in range ( 26 )]
s1hash = [ 0 for i in range ( 26 )]
s1len = len (s1)
s2len = len (s2)
if (s1len > s2len):
return False
left = 0
right = 0
while (right < s1len):
s1hash[ ord (s1[right]) - 97 ] + = 1
s2hash[ ord (s2[right]) - 97 ] + = 1
right + = 1
right - = 1
while (right < s2len):
if (s1hash = = s2hash):
return True
right + = 1
if (right ! = s2len):
s2hash[ ord (s2[right]) - 97 ] + = 1
s2hash[ ord (s2[left]) - 97 ] - = 1
left + = 1
return False
if __name__ = = '__main__' :
s1 = "ab"
s2 = "bbpobac"
if (checkAnagram(s1, s2)):
print ( "YES" )
else :
print ( "No" )
|
C#
using System;
using System.Collections.Generic;
class GFG{
static bool checkAnagram( string s1, string s2)
{
List< int > s2hash = new List< int >();
for ( int i=0;i<26;i++)
s2hash.Add(0);
List< int > s1hash = new List< int >();
for ( int i=0;i<26;i++)
s1hash.Add(0);
int s1len = s1.Length;
int s2len = s2.Length;
if (s1len > s2len)
return false ;
int left = 0, right = 0;
while (right < s1len) {
s1hash[s1[right] - 'a' ] += 1;
s2hash[s2[right] - 'a' ] += 1;
right++;
}
right -= 1;
while (right < s2len) {
if (s1hash == s2hash)
return true ;
right++;
if (right != s2len)
s2hash[s2[right] - 'a' ] += 1;
s2hash[s2[left] - 'a' ] -= 1;
left++;
}
return false ;
}
public static void Main()
{
string s1 = "ab" ;
string s2 = "bbpobac" ;
if (checkAnagram(s1, s2)== true )
Console.WriteLine( "NO" );
else
Console.WriteLine( "YES" );
}
}
|
Javascript
<script>
function checkAnagram(s1, s2)
{
var s2hash = Array(26).fill(0);
var s1hash = Array(26).fill(0);
var s1len = s1.length;
var s2len = s2.length;
if (s1len > s2len)
return false ;
var left = 0, right = 0;
while (right < s1len) {
s1hash[s1[right].charCodeAt(0) - 'a' .charCodeAt(0)] += 1;
s2hash[s2[right].charCodeAt(0) - 'a' .charCodeAt(0)] += 1;
right++;
}
right -= 1;
while (right < s2len) {
var ans = true ;
for ( var i =0; i<26; i++)
{
if (s1hash[i]!=s2hash[i])
{
ans = false ;
}
}
if (ans)
return true ;
right++;
if (right != s2len)
s2hash[s2[right].charCodeAt(0) - 'a' .charCodeAt(0)] += 1;
s2hash[s2[left].charCodeAt(0) - 'a' .charCodeAt(0)] -= 1;
left++;
}
return false ;
}
var s1 = "ab" ;
var s2 = "bbpobac" ;
if (checkAnagram(s1, s2))
document.write( "YES" );
else
document.write( "No" );
</script>
|
Time Complexity: O(26 * len(S2))
Auxiliary Space: O(26)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...