diff options
| author | mo khan <mo.khan@gmail.com> | 2020-05-17 21:41:31 -0600 |
|---|---|---|
| committer | mo khan <mo.khan@gmail.com> | 2020-05-17 21:41:31 -0600 |
| commit | f768b7a8b6ddd96f98d1ec98af02fec136ec1d03 (patch) | |
| tree | cb5f735d307eb96f4e87f1a1cfe38f85f8984156 /unit | |
| parent | be89d17bb38c1d795f49c762a7923fb11520e577 (diff) | |
Complete matched string
Diffstat (limited to 'unit')
| -rw-r--r-- | unit/1/matched_string.rb | 51 |
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 |
