0x81's blog

By 0x81, history, 19 months ago, translation, In English

The code (Ruby) below is a solution for https://leetcode.com/problems/uncrossed-lines/

Note: In Ruby Array#shift is O(1)

The trick is on the lines 3-4:

def max_uncrossed_lines a, b
    # These two lines
    c = a.to_set & b.to_set
    a, b = *[a, b].map! { | v | v.filter { c === _1 } }
    s = 0
    while !a.empty? && a.first == b.first
        a.shift
        b.shift
        s += 1
    end
    while !a.empty? && a.last == b.last
        a.pop
        b.pop
        s += 1
    end
    r0, r1 = *Array.new(2) { [0] * (b.size + 1) }
    for x in a
        for y, j in b.each_with_index
            r1[j + 1] = (x == y) ?
                1 + r0[j] :
                [r0[j + 1], r1[j]].max
        end
        r0, r1 = r1, r0
    end
    s + r0.last
end
  • Vote: I like it
  • -2
  • Vote: I do not like it

| Write comment?
»
19 months ago, # |
  Vote: I like it 0 Vote: I do not like it

I don't know how Ruby works, and I don't mean to disrespect you or anything, but did you really just wrote like 30 lines of code to solve LCS problem, for $$$N$$$, $$$M \leq 500$$$?