Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
add 1528 & 1579
  • Loading branch information
theforestvn88 committed Jun 30, 2024
commit 4c6a1ca44c2528654e9f531bf642d2d3e7bf5d84
6 changes: 6 additions & 0 deletions 1501-1600/1528_shuffle_string.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# @param {String} s
# @param {Integer[]} indices
# @return {String}
def restore_string(s, indices)
indices.zip(s.chars).sort_by(&:first).map(&:last).join
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
class UnionFind
def initialize(n)
@linked = (0..n).to_a
end

def find(x)
@linked[x] = find(@linked[x]) if x != @linked[x]
@linked[x]
end

def union(x, y)
return if (x_set = find(x)) == (y_set = find(y))

@linked[x_set] = @linked[y_set]
end

def num_of_sets
@linked[1..].map { |x| find(x) }.tally.size
end
end

# @param {Integer} n
# @param {Integer[][]} edges
# @return {Integer}
def max_num_edges_to_remove(n, edges)
adj = Array.new(3) { [] }
edges.each { |type, u, v|
adj[type-1] << [u, v]
}

removed_edges = 0
alice_uf = UnionFind.new(n)
bob_uf = UnionFind.new(n)

adj[2].each { |u, v|
a = alice_uf.union(u, v)
b = bob_uf.union(u, v)
removed_edges += 1 unless a && b
}

adj[1].each { |u, v|
removed_edges += 1 unless bob_uf.union(u, v)
}

adj[0].each { |u, v|
removed_edges += 1 unless alice_uf.union(u, v)
}

(alice_uf.num_of_sets == 1 && bob_uf.num_of_sets == 1) ? removed_edges : -1
end