From 725951ace11d4fdb03b2ecf47fdfc8681819c545 Mon Sep 17 00:00:00 2001 From: fartem Date: Wed, 18 Dec 2024 08:51:25 +0300 Subject: [PATCH] 2024-12-18 v. 7.3.8: added "652. Find Duplicate Subtrees" --- README.md | 1 + leetcode-ruby.gemspec | 2 +- lib/medium/652_find_duplicate_subtrees.rb | 33 ++++++ .../test_652_find_duplicate_subtrees.rb | 101 ++++++++++++++++++ 4 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 lib/medium/652_find_duplicate_subtrees.rb create mode 100644 test/medium/test_652_find_duplicate_subtrees.rb diff --git a/README.md b/README.md index 7636d710..9228ed54 100644 --- a/README.md +++ b/README.md @@ -602,3 +602,4 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/). | 641. Design Circular Deque | [Link](https://leetcode.com/problems/design-circular-deque/) | [Link](./lib/medium/641_design_circular_deque.rb) | [Link](./test/medium/test_641_design_circular_deque.rb) | | 647. Palindromic Substrings | [Link](https://leetcode.com/problems/palindromic-substrings/) | [Link](./lib/medium/647_palindromic_substrings.rb) | [Link](./test/medium/test_647_palindromic_substrings.rb) | | 648. Replace Words | [Link](https://leetcode.com/problems/replace-words/) | [Link](./lib/medium/648_replace_words.rb) | [Link](./test/medium/test_648_replace_words.rb) | +| 652. Find Duplicate Subtrees | [Link](https://leetcode.com/problems/find-duplicate-subtrees/) | [Link](./lib/medium/652_find_duplicate_subtrees.rb) | [Link](./test/medium/test_652_find_duplicate_subtrees.rb) | diff --git a/leetcode-ruby.gemspec b/leetcode-ruby.gemspec index 2683ff71..dd1047d6 100644 --- a/leetcode-ruby.gemspec +++ b/leetcode-ruby.gemspec @@ -5,7 +5,7 @@ require 'English' ::Gem::Specification.new do |s| s.required_ruby_version = '>= 3.0' s.name = 'leetcode-ruby' - s.version = '7.3.7' + s.version = '7.3.8' s.license = 'MIT' s.files = ::Dir['lib/**/*.rb'] + %w[README.md] s.executable = 'leetcode-ruby' diff --git a/lib/medium/652_find_duplicate_subtrees.rb b/lib/medium/652_find_duplicate_subtrees.rb new file mode 100644 index 00000000..b27f6340 --- /dev/null +++ b/lib/medium/652_find_duplicate_subtrees.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +# https://leetcode.com/problems/find-duplicate-subtrees/ +# @param {TreeNode} root +# @return {TreeNode[]} +def find_duplicate_subtrees(root) + @duplicates = ::Set.new + @nodes = {} + + traverse_for_find_duplicate_subtrees(root) + + @duplicates.to_a +end + +private + +# @param {TreeNode} node +# @return {String} +def traverse_for_find_duplicate_subtrees(node) + return '' unless node + + left = traverse_for_find_duplicate_subtrees(node.left) + right = traverse_for_find_duplicate_subtrees(node.right) + curr = "#{left} #{right} #{node.val}" + + if @nodes.include?(curr) + @duplicates << @nodes[curr] + else + @nodes[curr] = node + end + + curr +end diff --git a/test/medium/test_652_find_duplicate_subtrees.rb b/test/medium/test_652_find_duplicate_subtrees.rb new file mode 100644 index 00000000..7dfa3ae6 --- /dev/null +++ b/test/medium/test_652_find_duplicate_subtrees.rb @@ -0,0 +1,101 @@ +# frozen_string_literal: true + +require_relative '../test_helper' +require_relative '../../lib/common/binary_tree' +require_relative '../../lib/medium/652_find_duplicate_subtrees' +require 'minitest/autorun' + +class FindDuplicateSubtreesTest < ::Minitest::Test + def test_default_one + result = find_duplicate_subtrees( + ::TreeNode.new( + 1, + ::TreeNode.new( + 2, + ::TreeNode.new(4), + nil + ), + ::TreeNode.new( + 3, + ::TreeNode.new( + 2, + ::TreeNode.new(4), + nil + ), + ::TreeNode.new(4) + ) + ) + ) + + [ + ::TreeNode.new(4), + ::TreeNode.new( + 2, + ::TreeNode.new(4), + nil + ) + ].each_with_index do |node, index| + assert( + ::TreeNode.are_equals( + node, + result[index] + ) + ) + end + end + + def test_default_two + result = find_duplicate_subtrees( + ::TreeNode.new( + 2, + ::TreeNode.new(1), + ::TreeNode.new(1) + ) + ) + + [ + ::TreeNode.new(1) + ].each_with_index do |node, index| + assert( + ::TreeNode.are_equals( + node, + result[index] + ) + ) + end + end + + def test_default_three + result = find_duplicate_subtrees( + ::TreeNode.new( + 2, + ::TreeNode.new( + 2, + ::TreeNode.new(3), + nil + ), + ::TreeNode.new( + 2, + ::TreeNode.new(3), + nil + ) + ) + ) + + [ + ::TreeNode.new(3), + ::TreeNode.new( + 2, + ::TreeNode.new(3), + nil + ) + ].each_with_index do |node, index| + assert( + ::TreeNode.are_equals( + node, + result[index] + ) + ) + end + end +end