def longest_common_subsequence(first, second): if not isinstance(first, str) or not isinstance(second, str): raise ValueError("String inputs required") if (len(first) + 1) * (len(second) + 1) > 100000: raise ValueError("Teaching table budget exceeded") table = [[0] * (len(second) + 1) for _ in range(len(first) + 1)] for row in range(1, len(first) + 1): for column in range(1, len(second) + 1): if first[row - 1] == second[column - 1]: table[row][column] = table[row - 1][column - 1] + 1 else: table[row][column] = max(table[row - 1][column], table[row][column - 1]) row, column, result = len(first), len(second), [] while row and column: if first[row - 1] == second[column - 1]: result.append(first[row - 1]) row -= 1 column -= 1 elif table[row - 1][column] >= table[row][column - 1]: row -= 1 else: column -= 1 return "".join(reversed(result)) result = longest_common_subsequence("orchard", "chart") print(result, len(result)) print(repr(longest_common_subsequence("", "oak")))