Given a text txt[0..n-1] and a pattern pat[0..m-1], write a function search(char pat, char txt) that prints all occurrences of pat and its permutations (or anagrams) in txt. You may assume that n > m.
Expected time complexity is O(n)
1) Input: txt = "BACDGABCDA" pat = "ABCD" Output: Found at Index 0 Found at Index 5 Found at Index 6 2) Input: txt = "AAABABAA" pat = "AABA" Output: Found at Index 0 Found at Index 1 Found at Index 4
We strongly recommend that you click here and practice it, before moving on to the solution.
A simple idea is to modify Rabin Karp Algorithm. For example we can keep the hash value as sum of ASCII values of all characters under modulo of a big prime number. For every character of text, we can add the current character to hash value and subtract the first character of previous window. This solution looks good, but like standard Rabin Karp, the worst case time complexity of this solution is O(mn). The worst case occurs when all hash values match and we one by one match all characters.
We can achieve O(n) time complexity under the assumption that alphabet size is fixed which is typically true as we have maximum 256 possible characters in ASCII. The idea is to use two count arrays:
1) The first count array store frequencies of characters in pattern.
2) The second count array stores frequencies of characters in current window of text.
The important thing to note is, time complexity to compare two count arrays is O(1) as the number of elements in them are fixed (independent of pattern and text sizes). Following are steps of this algorithm.
1) Store counts of frequencies of pattern in first count array countP. Also store counts of frequencies of characters in first window of text in array countTW.
2) Now run a loop from i = M to N-1. Do following in loop.
…..a) If the two count arrays are identical, we found an occurrence.
…..b) Increment count of current character of text in countTW
…..c) Decrement count of first character in previous window in countWT
3) The last window is not checked by above loop, so explicitly check it.
Found at Index 0 Found at Index 5 Found at Index 6
Please refer complete article on Anagram Substring Search (Or Search for all permutations) for more details!
- Java Program to print all permutations of a given string
- Java Program to print distinct permutations of a string
- Print distinct sorted permutations with duplicates allowed in input
- Java substring() method memory leak issue and fix
- Java Program for Binary Search (Recursive and Iterative)
- Java Program for Linear Search
- Java Program to Search for a File in a Directory
- Java Program to Search an Element in a Linked List
- Java Program to Search an Element in a Circular Linked List
- Count number of Distinct Substring in a String
- Substring Sort
- Lexicographically smallest and largest substring of size k
- Length of the longest substring with consecutive characters
- Java program to read all mobile numbers present in given file
- Java Program to Check if all digits of a number divide it
- Java Program to check whether it is possible to make a divisible by 3 number using all digits in an array
- Java Program for efficiently print all prime factors of a given number
- Java Program for Maximum size square sub-matrix with all 1s
- Java program to merge contents of all the files in a directory
- Java program to read all Emails present in a Given file