 Open in App
Not now

# Check if a string contains an anagram of another string as its substring

• Difficulty Level : Hard
• 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

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach: Follow the steps below to solve the problem:

1. Initialize two Hashmaps s1hash and s2hash, to store the frequency of alphabets of the two strings.
2. If the length of S1 is greater than the length of S2, then print “NO”.
3. Iterate over the characters of the string S1 and update s1hash.
4. Iterate over the characters of the string S2 using the Sliding Window technique and update the HashMap accordingly.
5. For any substring of S2 of length equal to the length of S1, if both the Hashmaps are found to be equal, print “YES”.
6. Otherwise, print “NO”.

Below is the implementation of the above approach:

## C++

 `// C++ Program to implement``// the above approach` `#include ``using` `namespace` `std;` `// Function to check if string s2``// contains anagram of the string``// s1 as its substring``bool` `checkAnagram(string s1, string s2)``{``    ``// Stores frequencies of``    ``// characters in substrings of s2``    ``vector<``int``> s2hash(26, 0);` `    ``// Stores frequencies of``    ``// characters in s1``    ``vector<``int``> s1hash(26, 0);``    ``int` `s1len = s1.size();``    ``int` `s2len = s2.size();` `    ``// If length of s2 exceeds length of s1``    ``if` `(s1len > s2len)``        ``return` `false``;` `    ``int` `left = 0, right = 0;` `    ``// Store frequencies of characters in first``    ``// substring of length s1len in string s2``    ``while` `(right < s1len) {` `        ``s1hash[s1[right] - ``'a'``] += 1;``        ``s2hash[s2[right] - ``'a'``] += 1;``        ``right++;``    ``}` `    ``right -= 1;` `    ``// Perform Sliding Window technique``    ``while` `(right < s2len) {` `        ``// If hashmaps are found to be``        ``// identical for any substring``        ``if` `(s1hash == s2hash)``            ``return` `true``;` `        ``right++;` `        ``if` `(right != s2len)``            ``s2hash[s2[right] - ``'a'``] += 1;` `        ``s2hash[s2[left] - ``'a'``] -= 1;``        ``left++;``    ``}``    ``return` `false``;``}` `// Driver Code``int` `main()``{``    ``string s1 = ``"ab"``;``    ``string s2 = ``"bbpobac"``;` `    ``if` `(checkAnagram(s1, s2))``        ``cout << ``"YES\n"``;``    ``else``        ``cout << ``"No\n"``;` `    ``return` `0;``}`

## Java

 `// Java program for the above approach``import` `java.io.*;``import` `java.util.*;``class` `GFG``{` `  ``// Function to check if string s2``  ``// contains anagram of the string``  ``// s1 as its substring``  ``public` `static` `boolean` `checkAnagram(String s1, String s2)``  ``{` `    ``// Stores frequencies of``    ``// characters in substrings of s2``    ``int` `s2hash[] = ``new` `int``[``26``];` `    ``// Stores frequencies of``    ``// characters in s1``    ``int` `s1hash[] = ``new` `int``[``26``];``    ``int` `s1len = s1.length();``    ``int` `s2len = s2.length();` `    ``// If length of s2 exceeds length of s1``    ``if` `(s1len > s2len)``      ``return` `false``;``    ``int` `left = ``0``, right = ``0``;` `    ``// Store frequencies of characters in first``    ``// substring of length s1len in string s2``    ``while` `(right < s1len)``    ``{``      ``s1hash[s1.charAt(right) - ``'a'``] += ``1``;``      ``s2hash[s2.charAt(right) - ``'a'``] += ``1``;``      ``right++;``    ``}` `    ``right -= ``1``;` `    ``// Perform Sliding Window technique``    ``while` `(right < s2len) {` `      ``// If hashmaps are found to be``      ``// identical for any substring``      ``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``;``  ``}` `  ``// Driver Code``  ``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"``);``  ``}``}` `// This code is contributed by kingash.`

## Python3

 `# Python 3 Program to implement``# the above approach` `# Function to check if string s2``# contains anagram of the string``# s1 as its substring``def` `checkAnagram(s1, s2):``    ``# Stores frequencies of``    ``# characters in substrings of s2``    ``s2hash ``=` `[``0` `for` `i ``in` `range``(``26``)]` `    ``# Stores frequencies of``    ``# characters in s1``    ``s1hash ``=` `[``0` `for` `i ``in` `range``(``26``)]``    ``s1len ``=` `len``(s1)``    ``s2len ``=` `len``(s2)` `    ``# If length of s2 exceeds length of s1``    ``if` `(s1len > s2len):``        ``return` `False` `    ``left ``=` `0``    ``right ``=` `0` `    ``# Store frequencies of characters in first``    ``# substring of length s1len in string s2``    ``while` `(right < s1len):``        ``s1hash[``ord``(s1[right]) ``-` `97``] ``+``=` `1``        ``s2hash[``ord``(s2[right]) ``-` `97``] ``+``=` `1``        ``right ``+``=` `1` `    ``right ``-``=` `1` `    ``# Perform Sliding Window technique``    ``while` `(right < s2len):``        ``# If hashmaps are found to be``        ``# identical for any substring``        ``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` `# Driver Code``if` `__name__ ``=``=` `'__main__'``:``    ``s1 ``=` `"ab"``    ``s2 ``=` `"bbpobac"` `    ``if` `(checkAnagram(s1, s2)):``        ``print``(``"YES"``)``    ``else``:``        ``print``(``"No"``)``        ` `        ``# This code is contributed by ipg2016107`

## C#

 `// C# Program to implement``// the above approach``using` `System;``using` `System.Collections.Generic;``class` `GFG{``   ` `// Function to check if string s2``// contains anagram of the string``// s1 as its substring``static` `bool` `checkAnagram(``string` `s1, ``string` `s2)``{``    ``// Stores frequencies of``    ``// characters in substrings of s2``    ``List<``int``> s2hash = ``new` `List<``int``>();``    ``for``(``int` `i=0;i<26;i++)``        ``s2hash.Add(0);` `    ``// Stores frequencies of``    ``// characters in s1``    ``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 length of s2 exceeds length of s1``    ``if` `(s1len > s2len)``        ``return` `false``;` `    ``int` `left = 0, right = 0;` `    ``// Store frequencies of characters in first``    ``// substring of length s1len in string s2``    ``while` `(right < s1len) {` `        ``s1hash[s1[right] - ``'a'``] += 1;``        ``s2hash[s2[right] - ``'a'``] += 1;``        ``right++;``    ``}` `    ``right -= 1;` `    ``// Perform Sliding Window technique``    ``while` `(right < s2len) {` `        ``// If hashmaps are found to be``        ``// identical for any substring``        ``if` `(s1hash == s2hash)``            ``return` `true``;` `        ``right++;` `        ``if``(right != s2len)``            ``s2hash[s2[right] - ``'a'``] += 1;` `        ``s2hash[s2[left] - ``'a'``] -= 1;``        ``left++;``    ``}``    ``return` `false``;``}` `// Driver Code``public` `static` `void` `Main()``{``    ``string` `s1 = ``"ab"``;``    ``string` `s2 = ``"bbpobac"``;` `    ``if` `(checkAnagram(s1, s2)==``true``)``        ``Console.WriteLine(``"NO"``);``    ``else``        ``Console.WriteLine(``"YES"``);``}``}` `// This code is contributed by bgangawar59.`

## Javascript

 ``

Output:

`YES`

Time Complexity: O(26 * len(S2))
Auxiliary Space: O(26)

My Personal Notes arrow_drop_up