summaryrefslogtreecommitdiff
path: root/unit
diff options
context:
space:
mode:
authormo khan <mo.khan@gmail.com>2020-05-17 21:41:31 -0600
committermo khan <mo.khan@gmail.com>2020-05-17 21:41:31 -0600
commitf768b7a8b6ddd96f98d1ec98af02fec136ec1d03 (patch)
treecb5f735d307eb96f4e87f1a1cfe38f85f8984156 /unit
parentbe89d17bb38c1d795f49c762a7923fb11520e577 (diff)
Complete matched string
Diffstat (limited to 'unit')
-rw-r--r--unit/1/matched_string.rb51
1 files changed, 51 insertions, 0 deletions
diff --git a/unit/1/matched_string.rb b/unit/1/matched_string.rb
new file mode 100644
index 0000000..2836d16
--- /dev/null
+++ b/unit/1/matched_string.rb
@@ -0,0 +1,51 @@
+require 'bundler/inline'
+
+gemfile do
+ source 'https://rubygems.org'
+
+ gem 'minitest'
+end
+
+require 'minitest/autorun'
+
+=begin
+A matched string is a sequence of {, }, (, ), [, and ] characters that are properly matched.
+For example, “{{()[]}}” is a matched string, but this “{{()]}” is not, since the second { is matched with a ].
+Show how to use a stack so that, given a string of length n, you can determine if it is a matched string in O(n) time.
+=end
+
+class Example < Minitest::Test
+ def matches?(open, close)
+ case open
+ when '('
+ return close == ')'
+ when '{'
+ return close == '}'
+ when '['
+ return close == ']'
+ else
+ raise [open, close].inspect
+ end
+ end
+
+ def matched_string?(string)
+ stack = []
+ string.chars.each do |char|
+ case char
+ when '{', '[', '('
+ stack.push(char)
+ else
+ return unless matches?(stack.pop, char)
+ end
+ end
+ stack.size.zero?
+ end
+
+ def test_valid
+ assert matched_string?("{{()[]}}")
+ end
+
+ def test_invalid
+ refute matched_string?("{{()]}")
+ end
+end