diff --git a/README.md b/README.md index 7b2ff29e..0ce63328 100644 --- a/README.md +++ b/README.md @@ -667,3 +667,4 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/). | 458. Poor Pigs | [Link](https://leetcode.com/problems/poor-pigs/) | [Link](./lib/hard/458_poor_pigs.rb) | [Link](./test/hard/test_458_poor_pigs.rb) | | 871. Minimum Number of Refueling Stops | [Link](https://leetcode.com/problems/minimum-number-of-refueling-stops/) | [Link](./lib/hard/871_minimum_number_of_refueling_stops.rb) | [Link](./test/hard/test_871_minimum_number_of_refueling_stops.rb) | | 895. Maximum Frequency Stack | [Link](https://leetcode.com/problems/maximum-frequency-stack/) | [Link](./lib/hard/895_maximum_frequency_stack.rb) | [Link](./test/hard/test_895_maximum_frequency_stack.rb) | +| 936. Stamping The Sequence | [Link](https://leetcode.com/problems/stamping-the-sequence/) | [Link](./lib/hard/936_stamping_the_sequence.rb) | [Link](./test/hard/test_936_stamping_the_sequence.rb) | diff --git a/leetcode-ruby.gemspec b/leetcode-ruby.gemspec index 58543e7b..f97afa95 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.9.7' + s.version = '7.9.8' s.license = 'MIT' s.files = ::Dir['lib/**/*.rb'] + %w[README.md] s.executable = 'leetcode-ruby' diff --git a/lib/hard/936_stamping_the_sequence.rb b/lib/hard/936_stamping_the_sequence.rb new file mode 100644 index 00000000..ab87b2c5 --- /dev/null +++ b/lib/hard/936_stamping_the_sequence.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: false + +# https://leetcode.com/problems/stamping-the-sequence/ +# @param {String} stamp +# @param {String} target +# @return {Integer[]} +def moves_to_stamp(stamp, target) + stamp_wc = '?' * stamp.size + a = + (10 * target.size).times.each_with_object([]) do |_j, ans| + break ans unless (0..target.size - stamp.size).reduce(false) do |r, i| + str = target[i, stamp.size] + if !str.all_wild? && stamp.match_wild?(str) + ans << i + target[i, stamp.size] = stamp_wc + + true + else + r + end + end + end + + target.all_wild? ? a.reverse : [] +end + +# String expansion +class String + # Check is wild + def wild? = eql?('?') + + # Check is match + def match_wild?(b) + return false unless size == b.size + + chars.zip(b.chars).all? { |cp| cp.first == cp.last || cp.any?(&:wild?) } + end + + # Check is all wild + def all_wild? = chars.all?(&:wild?) +end diff --git a/test/hard/test_936_stamping_the_sequence.rb b/test/hard/test_936_stamping_the_sequence.rb new file mode 100644 index 00000000..9d74fa0a --- /dev/null +++ b/test/hard/test_936_stamping_the_sequence.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: false + +require_relative '../test_helper' +require_relative '../../lib/hard/936_stamping_the_sequence' +require 'minitest/autorun' + +class StampingTheSequenceTest < ::Minitest::Test + def test_default_one + assert_equal( + [0, 2], + moves_to_stamp( + 'abc', + 'ababc' + ) + ) + end + + def test_default_two + assert_equal( + [0, 3, 1], + moves_to_stamp( + 'abca', + 'aabcaca' + ) + ) + end +end