From c45c4bc8d14aaca69514eea9fb833b24f87c5829 Mon Sep 17 00:00:00 2001 From: fartem Date: Tue, 19 Nov 2024 06:33:55 +0300 Subject: [PATCH] 2024-11-19 v. 7.0.6: fixed "438. Find All Anagrams in a String" --- README.md | 1 + leetcode-ruby.gemspec | 2 +- .../438_find_all_anagrams_in_a_string.rb | 39 +++++++++++++++++++ .../test_438_find_all_anagrams_in_a_string.rb | 27 +++++++++++++ 4 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 lib/medium/438_find_all_anagrams_in_a_string.rb create mode 100644 test/medium/test_438_find_all_anagrams_in_a_string.rb diff --git a/README.md b/README.md index 85c93e1a..c1c5d602 100644 --- a/README.md +++ b/README.md @@ -571,3 +571,4 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/). | 429. N-ary Tree Level Order Traversal | [Link](https://leetcode.com/problems/n-ary-tree-level-order-traversal/) | [Link](./lib/medium/429_n_ary_tree_level_order_traversal.rb) | [Link](./test/medium/test_429_n_ary_tree_level_order_traversal.rb) | | 435. Non-overlapping Intervals | [Link](https://leetcode.com/problems/non-overlapping-intervals/) | [Link](./lib/medium/435_non_overlapping_intervals.rb) | [Link](./test/medium/test_435_non_overlapping_intervals.rb) | | 437. Path Sum III | [Link](https://leetcode.com/problems/path-sum-iii/) | [Link](./lib/medium/437_path_sum_iii.rb) | [Link](./test/medium/test_437_path_sum_iii.rb) | +| 438. Find All Anagrams in a String | [Link](https://leetcode.com/problems/find-all-anagrams-in-a-string/) | [Link](./lib/medium/438_find_all_anagrams_in_a_string.rb) | [Link](./test/medium/test_438_find_all_anagrams_in_a_string.rb) | diff --git a/leetcode-ruby.gemspec b/leetcode-ruby.gemspec index 166c56a6..fc55607b 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.0.5' + s.version = '7.0.6' s.license = 'MIT' s.files = ::Dir['lib/**/*.rb'] + %w[README.md] s.executable = 'leetcode-ruby' diff --git a/lib/medium/438_find_all_anagrams_in_a_string.rb b/lib/medium/438_find_all_anagrams_in_a_string.rb new file mode 100644 index 00000000..d6eb764c --- /dev/null +++ b/lib/medium/438_find_all_anagrams_in_a_string.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +# https://leetcode.com/problems/find-all-anagrams-in-a-string/ +# @param {String} s +# @param {String} p +# @return {Integer[]} +def find_anagrams(s, p) + result = [] + c_p = ::Array.new(128, 0) + p.each_byte { |b| c_p[b] += 1 } + + c_s = ::Array.new(128, 0) + c = 0 + (0...s.size).each do |i| + c_s[s[i].ord] += 1 + + next if (i - c + 1) < p.size + + result << c if is_anagram?(c_s, c_p) + + c_s[s[c].ord] -= 1 + c += 1 + end + + result +end + +private + +# @param {Integer[]} c_s +# @param {Integer[]} c_p +# @return {Boolean} +def is_anagram?(c_s, c_p) + (0...c_s.size).each do |i| + return false unless c_s[i] == c_p[i] + end + + true +end diff --git a/test/medium/test_438_find_all_anagrams_in_a_string.rb b/test/medium/test_438_find_all_anagrams_in_a_string.rb new file mode 100644 index 00000000..229c9088 --- /dev/null +++ b/test/medium/test_438_find_all_anagrams_in_a_string.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +require_relative '../test_helper' +require_relative '../../lib/medium/438_find_all_anagrams_in_a_string' +require 'minitest/autorun' + +class FindAllAnagramsInAStringTest < ::Minitest::Test + def test_default_one + assert_equal( + [0, 6], + find_anagrams( + 'cbaebabacd', + 'abc' + ) + ) + end + + def test_default_two + assert_equal( + [0, 1, 2], + find_anagrams( + 'abab', + 'ab' + ) + ) + end +end