# Number of sub-strings which are anagram of any sub-string of another string

Given two strings **S1** and **S2**, the task is to count the number of sub-strings of **S1** that are anagrams of any sub-string of **S2**.

**Examples:**

Input:S1 = “ABB”, S2 = “BAB”

Output:5

There are 6 sub-strings of S1 : “A”, “B”, “B”, “AB”, “BB” and “ABB”

Out of which only “BB” is the one which is not an anagram of any sub-string of S2.

Input:S1 = “PLEASEHELPIMTRAPPED”, S2 = “INAKICKSTARTFACTORY”

Output:9

**Naive approach:** A simple approach is to check all the sub-strings of **S1** against all the sub-strings of **S2** whether they are anagrams or not.

**Efficient approach:** Take all the sub-strings of **S1** one by one say **temp** and check whether **temp** is an anagram of any sub-string of **S2** by calculating the frequencies of all the characters of **temp** and comparing it with the character frequencies of sub-strings of **S2** having **length = length(temp)**.

This can be done with a single traversal by taking the first **length(temp)** characters of **S2** and then for every iteration, add the frequency of the next character of the string and remove the frequency of the first character of the previously chosen sub-string until the complete string is traversed.

Below is the implementation of the above approach:

`// C++ program to find the number of sub-strings ` `// of s1 which are anagram of any sub-string of s2 ` ` ` `#include <bits/stdc++.h> ` `using` `namespace` `std; ` ` ` `#define ALL_CHARS 256 ` ` ` `// This function returns true if ` `// contents of arr1[] and arr2[] ` `// are same, otherwise false. ` `bool` `compare(` `char` `* arr1, ` `char` `* arr2) ` `{ ` ` ` `for` `(` `int` `i = 0; i < ALL_CHARS; i++) ` ` ` `if` `(arr1[i] != arr2[i]) ` ` ` `return` `false` `; ` ` ` ` ` `return` `true` `; ` `} ` ` ` `// This function search for all permutations ` `// of string pat[] in string txt[] ` `bool` `search(string pat, string txt) ` `{ ` ` ` `int` `M = pat.length(); ` ` ` `int` `N = txt.length(); ` ` ` ` ` `int` `i; ` ` ` ` ` `// countP[]: Store count of all characters ` ` ` `// of pattern ` ` ` `// countTW[]: Store count of current ` ` ` `// window of text ` ` ` `char` `countP[ALL_CHARS] = { 0 }; ` ` ` `char` `countTW[ALL_CHARS] = { 0 }; ` ` ` `for` `(i = 0; i < M; i++) { ` ` ` `(countP[pat[i]])++; ` ` ` `(countTW[txt[i]])++; ` ` ` `} ` ` ` ` ` `// Traverse through remaining ` ` ` `// characters of pattern ` ` ` `for` `(i = M; i < N; i++) { ` ` ` ` ` `// Compare counts of current ` ` ` `// window of text with ` ` ` `// counts of pattern[] ` ` ` `if` `(compare(countP, countTW)) { ` ` ` `// cout<<pat<<" "<<txt<<" "; ` ` ` `return` `true` `; ` ` ` `} ` ` ` ` ` `// Add current character to current window ` ` ` `(countTW[txt[i]])++; ` ` ` ` ` `// Remove the first character ` ` ` `// of previous window ` ` ` `countTW[txt[i - M]]--; ` ` ` `} ` ` ` ` ` `// Check for the last window in text ` ` ` `if` `(compare(countP, countTW)) ` ` ` `return` `true` `; ` ` ` ` ` `return` `false` `; ` `} ` ` ` `// Function to return the number of sub-strings of s1 ` `// that are anagrams of any sub-string of s2 ` `int` `calculatesubString(string s1, string s2, ` `int` `n) ` `{ ` ` ` `// initializing variables ` ` ` `int` `count = 0, j = 0, x = 0; ` ` ` ` ` `// outer loop for picking starting point ` ` ` `for` `(` `int` `i = 0; i < n; i++) { ` ` ` ` ` `// loop for different length of substrings ` ` ` `for` `(` `int` `len = 1; len <= n - i; len++) { ` ` ` ` ` `// If s2 has any substring which is ` ` ` `// anagram of s1.substr(i, len) ` ` ` `if` `(search(s1.substr(i, len), s2)) { ` ` ` ` ` `// increment the count ` ` ` `count = count + 1; ` ` ` `} ` ` ` `} ` ` ` `} ` ` ` `return` `count; ` `} ` ` ` `// Driver code ` `int` `main() ` `{ ` ` ` `string str1 = ` `"PLEASEHELPIMTRAPPED"` `; ` ` ` `string str2 = ` `"INAKICKSTARTFACTORY"` `; ` ` ` ` ` `int` `len = str1.length(); ` ` ` ` ` `cout << calculatesubString(str1, str2, len); ` ` ` ` ` `return` `0; ` `} ` |

*chevron_right*

*filter_none*

**Output:**

9

## Recommended Posts:

- Count of total anagram substrings
- Number of substrings of a string
- Sum of all substrings of a string representing a number | Set 1
- Number of even substrings in a string of digits
- Number of substrings of one string present in other
- Number of substrings with odd decimal value in a binary string
- Number of substrings divisible by 6 in a string of integers
- Given a binary string, count number of substrings that start and end with 1.
- Rearrange the string to maximize the number of palindromic substrings
- Count the number of vowels occurring in all the substrings of given string
- Sum of all substrings of a string representing a number | Set 2 (Constant Extra Space)
- Find if a given string can be represented from a substring by iterating the substring “n” times
- Encrypt string with product of number of vowels and consonants in substring of size k
- Covert string X to an anagram of string Y with minimum replacements
- Partition given string in such manner that i'th substring is sum of (i-1)'th and (i-2)'th substring

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.