All Longest Common Subsequences | nikhilnayunigari



All Longest Common Subsequences | nikhilnayunigari

Most of us are aware of the dynamic programming problem Longest Common Subsequences. Given two strings, it returns a longest common sequence. Even though there are multiple sequences of same length, we can only get one using the LCS algorithm.

The above problem "Trip" asks to print all longest common sequences in lexicographic order. This can be done by modifying the original algorithm.

The original LCS algorithm has two parts. In the first part, we build two matrices. The first matrix gives us the length of the LCS and the second matrix gives us directions to follow while backtracking. In the second part we use directions in the second matrix and build LCS. A detailed explanation of this algorithm can be found at

http://en.wikipedia.org/wiki/Longest_common_subsequence_problem

However, if we are asked to return all LCS's, then we need to modify the way we build the second matrix and backtracking algorithm. There are three cases to be considered while building the second matrix.

1. If characters at positions i, j are same, then we place a diagonal arrow at position [i][j].

2. If characters are not same, then we compare values at positions [i-1][j] and [i][j-1] in the first matrix. If value at [i-1][j] is greater than [i][j-1] then we place a left arrow otherwise an upward arrow.

3. In LCS algorithm, if both values are equal, then either an upward arrow or a left arrow is placed depending on the implementation. This basically defines the direction that is taken while backtracking in LCS.

If we want to find out all LCS's, then in the third step, we have to place a new character and while back tracking, we have to go in both upward and left directions when ever we come across this character. This little modification should be enough to find out all LCS's.


Read full article from All Longest Common Subsequences | nikhilnayunigari


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