Find all occurrences of all permutations of a smaller string in a larger string. | CODING INTERVIEW ARCHIVES



Find all occurrences of all permutations of a smaller string in a larger string. | CODING INTERVIEW ARCHIVES

Given two strings, the problem asks us to identify all occurrences of the smaller string and it's permutations in the larger string.
For example:
     string_large="MISSISSIPPI"
     string_small="IS"
Then the program must identify the following occurrences...{1,3,4,6}

Let's assume that the larger string is of length n and the smaller string is of length m.

A very brute force approach to solve this would be to generate all permutations of the smaller string and store them in a vector and then use strstr() to find all the occurrences. This would give a time complexity of O(m!) in the worst case(all the alpahabets in the string are different).

The approach suggested here is slightly better and does the job in O(m*n) time, using some extra space.

Approach:

The basic idea here is to maintain a hash which stores the number of occurences of each alphabet in the smaller string. Once this is done we start iterating in the larger string, maintaining a start index which tells us where the current string starts from.
For every start index in the large string, we call a new function which checks if the next m characters is a permutation of the smaller string. In this function, we run a loop of length m, and we check for every character if it has a non zero value in the hash.
If yes, we decrease this by 1 and move on.
If no, return false, as all the occurrences of that character has been exhausted, and a permutation is still not found.

Now, if the check function returns true, then we have found an occurrence and so we print this to the screen.
         else repopulate the hash, and move the start index forward by 1.

Note:
1. Sometimes it is required to print -1 in case of no occurrence found, for this we can simply maintain a flag which can be set when the first occurrence is printed.
2. The below code works if the strings have lower case english alphabets. A larger hash can be maintained for a bigger character set.

Read full article from Find all occurrences of all permutations of a smaller string in a larger string. | CODING INTERVIEW ARCHIVES


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts