From c3c832509bf080399e609eb69d734ecc3284ce7c Mon Sep 17 00:00:00 2001 From: fartem Date: Fri, 18 Oct 2024 09:50:57 +0300 Subject: [PATCH] 2024-10-18 v. 6.8.4: added "316. Remove Duplicate Letters" --- README.md | 1 + leetcode-ruby.gemspec | 2 +- lib/medium/316_remove_duplicate_letters.rb | 28 +++++++++++++++++++ .../test_316_remove_duplicate_letters.rb | 25 +++++++++++++++++ 4 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 lib/medium/316_remove_duplicate_letters.rb create mode 100644 test/medium/test_316_remove_duplicate_letters.rb diff --git a/README.md b/README.md index 94f3d198..a0136548 100644 --- a/README.md +++ b/README.md @@ -549,3 +549,4 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/). | 299. Bulls and Cows | [Link](https://leetcode.com/problems/bulls-and-cows/) | [Link](./lib/medium/299_bulls_and_cows.rb) | [Link](./test/medium/test_299_bulls_and_cows.rb) | | 300. Longest Increasing Subsequence | [Link](https://leetcode.com/problems/longest-increasing-subsequence/) | [Link](./lib/medium/300_longest_increasing_subsequence.rb) | [Link](./test/medium/test_300_longest_increasing_subsequence.rb) | | 304. Range Sum Query 2D - Immutable | [Link](https://leetcode.com/problems/range-sum-query-2d-immutable/) | [Link](./lib/medium/304_range_sum_query_2d_immutable.rb) | [Link](./test/medium/test_304_range_sum_query_2d_immutable.rb) | +| 316. Remove Duplicate Letters | [Link](https://leetcode.com/problems/remove-duplicate-letters/) | [Link](./lib/medium/316_remove_duplicate_letters.rb) | [Link](./test/medium/test_316_remove_duplicate_letters.rb) | diff --git a/leetcode-ruby.gemspec b/leetcode-ruby.gemspec index 8baf11c7..872f1752 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 = '6.8.3' + s.version = '6.8.4' s.license = 'MIT' s.files = ::Dir['lib/**/*.rb'] + %w[README.md] s.executable = 'leetcode-ruby' diff --git a/lib/medium/316_remove_duplicate_letters.rb b/lib/medium/316_remove_duplicate_letters.rb new file mode 100644 index 00000000..9f32c050 --- /dev/null +++ b/lib/medium/316_remove_duplicate_letters.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +# https://leetcode.com/problems/remove-duplicate-letters/ +# @param {String} s +# @return {String} +def remove_duplicate_letters(s) + last_indices = ::Array.new(26, 0) + s.each_char.with_index { |c, i| last_indices[c.ord - 'a'.ord] = i } + + seen = ::Array.new(26, false) + stack = [] + + s.each_char.with_index do |c, i| + c_index = c.ord - 'a'.ord + + next if seen[c_index] + + seen[stack.pop] = false while !stack.empty? && stack.last > c_index && i < last_indices[stack.last] + + stack.push(c_index) + seen[c_index] = true + end + + result = '' + result += (stack.pop + 'a'.ord).chr until stack.empty? + + result.reverse +end diff --git a/test/medium/test_316_remove_duplicate_letters.rb b/test/medium/test_316_remove_duplicate_letters.rb new file mode 100644 index 00000000..0ee1134b --- /dev/null +++ b/test/medium/test_316_remove_duplicate_letters.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +require_relative '../test_helper' +require_relative '../../lib/medium/316_remove_duplicate_letters' +require 'minitest/autorun' + +class RemoveDuplicateLettersTest < ::Minitest::Test + def test_default_one + assert_equal( + 'abc', + remove_duplicate_letters( + 'bcabc' + ) + ) + end + + def test_default_two + assert_equal( + 'acdb', + remove_duplicate_letters( + 'cbacdcbc' + ) + ) + end +end