diff --git a/README.md b/README.md index 98fbeba0..a0ba528b 100644 --- a/README.md +++ b/README.md @@ -634,6 +634,7 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/). | 869. Reordered Power of 2 | [Link](https://leetcode.com/problems/reordered-power-of-2/) | [Link](./lib/medium/869_reordered_power_of_2.rb) | [Link](./test/medium/test_869_reordered_power_of_2.rb) | | 880. Decoded String at Index | [Link](https://leetcode.com/problems/decoded-string-at-index/) | [Link](./lib/medium/880_decoded_string_at_index.rb) | [Link](./test/medium/test_880_decoded_string_at_index.rb) | | 889. Construct Binary Tree from Preorder and Postorder Traversal | [Link](https://leetcode.com/problems/construct-binary-tree-from-preorder-and-postorder-traversal/) | [Link](./lib/medium/889_construct_binary_tree_from_preorder_and_postorder_traversal.rb) | [Link](./test/medium/test_889_construct_binary_tree_from_preorder_and_postorder_traversal.rb) | +| 890. Find and Replace Pattern | [Link](https://leetcode.com/problems/find-and-replace-pattern/) | [Link](./lib/medium/890_find_and_replace_pattern.rb) | [Link](./test/medium/test_890_find_and_replace_pattern.rb) | ### Hard diff --git a/leetcode-ruby.gemspec b/leetcode-ruby.gemspec index 4eef5154..77a8642b 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.8.1' + s.version = '7.8.2' s.license = 'MIT' s.files = ::Dir['lib/**/*.rb'] + %w[README.md] s.executable = 'leetcode-ruby' diff --git a/lib/medium/890_find_and_replace_pattern.rb b/lib/medium/890_find_and_replace_pattern.rb new file mode 100644 index 00000000..cfbc7b79 --- /dev/null +++ b/lib/medium/890_find_and_replace_pattern.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +# https://leetcode.com/problems/find-and-replace-pattern/ +# @param {String[]} words +# @param {String} pattern +# @return {String[]} +def find_and_replace_pattern(words, pattern) = words.select { |word| are_match(word, pattern) } + +private + +# @param {String} word +# @param {String} word +# @return {Boolean} +def are_match(word, pattern) + values = {} + (0...word.size).each do |i| + w = word[i] + p = pattern[i] + + values[w] = p unless values.include?(w) + + return false unless values[w] == p + end + + seen = ::Array.new(128, false) + values.each_value do |value| + return false if seen[value.ord] + + seen[value.ord] = true + end + + true +end diff --git a/test/medium/test_890_find_and_replace_pattern.rb b/test/medium/test_890_find_and_replace_pattern.rb new file mode 100644 index 00000000..bf8da2ea --- /dev/null +++ b/test/medium/test_890_find_and_replace_pattern.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +require_relative '../test_helper' +require_relative '../../lib/medium/890_find_and_replace_pattern' +require 'minitest/autorun' + +class FindAndReplacePatternTest < ::Minitest::Test + def test_default_one + assert_equal( + %w[mee aqq], + find_and_replace_pattern( + %w[abc deq mee aqq dkd ccc], + 'abb' + ) + ) + end + + def test_default_two + assert_equal( + %w[a b c], + find_and_replace_pattern( + %w[a b c], + 'a' + ) + ) + end +end