Home | History | Annotate | Download | only in common_lib
      1 # Copyright 2015 The Chromium OS Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 # Utilities for operations on sequences / lists
      6 
      7 
      8 def lcs_length(x, y):
      9     """
     10     Computes the length of a Longest Common Subsequence (LCS) of x and y.
     11 
     12     Algorithm adapted from "Introduction to Algorithms" - CLRS.
     13 
     14     @param x: list, one sequence
     15     @param y: list, the other sequence
     16 
     17     """
     18     m = len(x)
     19     n = len(y)
     20     c = dict() # Use dictionary as a 2D array, keys are tuples
     21 
     22     for i in range(m + 1):
     23         c[i, 0] = 0
     24 
     25     for j in range(n + 1):
     26         c[0, j] = 0
     27 
     28     for i in range(1, m + 1):
     29         for j in range(1, n + 1):
     30             if x[i - 1] == y[j - 1]:
     31                 c[i, j] = c[i - 1, j - 1] + 1
     32             else:
     33                 c[i, j] = max(c[i - 1, j], c[i, j - 1])
     34 
     35     return c[m, n]