Skip to content

Commit c9ef7f8

Browse files
committed
2025-01-14 v. 8.0.3: added "1106. Parsing A Boolean Expression"
1 parent 203e6ff commit c9ef7f8

File tree

4 files changed

+63
-1
lines changed

4 files changed

+63
-1
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -672,3 +672,4 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/).
672672
| 895. Maximum Frequency Stack | [Link](https://leetcode.com/problems/maximum-frequency-stack/) | [Link](./lib/hard/895_maximum_frequency_stack.rb) | [Link](./test/hard/test_895_maximum_frequency_stack.rb) |
673673
| 936. Stamping The Sequence | [Link](https://leetcode.com/problems/stamping-the-sequence/) | [Link](./lib/hard/936_stamping_the_sequence.rb) | [Link](./test/hard/test_936_stamping_the_sequence.rb) |
674674
| 968. Binary Tree Cameras | [Link](https://leetcode.com/problems/binary-tree-cameras/) | [Link](./lib/hard/968_binary_tree_cameras.rb) | [Link](./test/hard/test_968_binary_tree_cameras.rb) |
675+
| 1106. Parsing A Boolean Expression | [Link](https://leetcode.com/problems/parsing-a-boolean-expression/) | [Link](./lib/hard/1106_parsing_a_boolean_expression.rb) | [Link](./test/hard/test_1106_parsing_a_boolean_expression.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 = '8.0.2'
8+
s.version = '8.0.3'
99
s.license = 'MIT'
1010
s.files = ::Dir['lib/**/*.rb'] + %w[README.md]
1111
s.executable = 'leetcode-ruby'
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# frozen_string_literal: false
2+
3+
# https://leetcode.com/problems/parsing-a-boolean-expression/
4+
# @param {String} expression
5+
# @return {Boolean}
6+
def parse_bool_expr(expression) = calc_bool_expr(expression, 0, expression.size - 1)
7+
8+
private
9+
10+
# @param {String} e
11+
# @param {String} l
12+
# @param {String} h
13+
# @return {Boolean}
14+
def calc_bool_expr(e, l, h)
15+
return e[l] == 't' if l == h
16+
17+
op = e[l]
18+
c = 0
19+
prev = l + 2
20+
result = op != '|'
21+
22+
((l + 1)..h).each do |i|
23+
v = e[i]
24+
25+
case v
26+
when '('
27+
c += 1
28+
when ')'
29+
c -= 1
30+
end
31+
32+
next unless (c == 1 && v == ',') || (c.zero? && v == ')')
33+
34+
next_result = calc_bool_expr(e, prev, i - 1)
35+
prev = i + 1
36+
37+
case op
38+
when '|'
39+
result ||= next_result
40+
when '&'
41+
result &&= next_result
42+
else
43+
result = !next_result
44+
end
45+
end
46+
47+
result
48+
end
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# frozen_string_literal: false
2+
3+
require_relative '../test_helper'
4+
require_relative '../../lib/hard/1106_parsing_a_boolean_expression'
5+
require 'minitest/autorun'
6+
7+
class ParsingABooleanExpressionTest < ::Minitest::Test
8+
def test_default_one = assert(!parse_bool_expr('&(|(f))'))
9+
10+
def test_default_two = assert(parse_bool_expr('|(f,f,f,t)'))
11+
12+
def test_default_three = assert(parse_bool_expr('!(&(f,t))'))
13+
end

0 commit comments

Comments
 (0)