Skip to content

Commit 4e04499

Browse files
authored
Merge pull request #776 from fartem/438_Find_All_Anagrams_in_a_String
2024-11-19 v. 7.0.6: fixed "438. Find All Anagrams in a String"
2 parents 6db9a53 + c45c4bc commit 4e04499

File tree

4 files changed

+68
-1
lines changed

4 files changed

+68
-1
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -571,3 +571,4 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/).
571571
| 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) |
572572
| 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) |
573573
| 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) |
574+
| 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) |

leetcode-ruby.gemspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ require 'English'
55
::Gem::Specification.new do |s|
66
s.required_ruby_version = '>= 3.0'
77
s.name = 'leetcode-ruby'
8-
s.version = '7.0.5'
8+
s.version = '7.0.6'
99
s.license = 'MIT'
1010
s.files = ::Dir['lib/**/*.rb'] + %w[README.md]
1111
s.executable = 'leetcode-ruby'
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# frozen_string_literal: true
2+
3+
# https://leetcode.com/problems/find-all-anagrams-in-a-string/
4+
# @param {String} s
5+
# @param {String} p
6+
# @return {Integer[]}
7+
def find_anagrams(s, p)
8+
result = []
9+
c_p = ::Array.new(128, 0)
10+
p.each_byte { |b| c_p[b] += 1 }
11+
12+
c_s = ::Array.new(128, 0)
13+
c = 0
14+
(0...s.size).each do |i|
15+
c_s[s[i].ord] += 1
16+
17+
next if (i - c + 1) < p.size
18+
19+
result << c if is_anagram?(c_s, c_p)
20+
21+
c_s[s[c].ord] -= 1
22+
c += 1
23+
end
24+
25+
result
26+
end
27+
28+
private
29+
30+
# @param {Integer[]} c_s
31+
# @param {Integer[]} c_p
32+
# @return {Boolean}
33+
def is_anagram?(c_s, c_p)
34+
(0...c_s.size).each do |i|
35+
return false unless c_s[i] == c_p[i]
36+
end
37+
38+
true
39+
end
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# frozen_string_literal: true
2+
3+
require_relative '../test_helper'
4+
require_relative '../../lib/medium/438_find_all_anagrams_in_a_string'
5+
require 'minitest/autorun'
6+
7+
class FindAllAnagramsInAStringTest < ::Minitest::Test
8+
def test_default_one
9+
assert_equal(
10+
[0, 6],
11+
find_anagrams(
12+
'cbaebabacd',
13+
'abc'
14+
)
15+
)
16+
end
17+
18+
def test_default_two
19+
assert_equal(
20+
[0, 1, 2],
21+
find_anagrams(
22+
'abab',
23+
'ab'
24+
)
25+
)
26+
end
27+
end

0 commit comments

Comments
 (0)