Commit 4f53805

mo khan <mo.khan@gmail.com>
2020-08-13 01:26:15
iterative attempt
1 parent 3d5b139
Changed files (1)
misc
subsequence
misc/subsequence/main.rb
@@ -7,11 +7,6 @@ def assert_equal(x, y)
 end
 
 =begin
-time: O(n)
-space: O(1)
-
-wildcard = false
-
  x
 |a|b|c|d|e|f|
 
@@ -90,7 +85,6 @@ class Solution
       self.next.match?(input)
     end
 
-
     def to_s
       self.class.to_s
     end
@@ -197,14 +191,76 @@ class Solution
     machine = build_machine(pattern)
     machine.parse(sequence)
   end
+
+  def self.state_for(token)
+    return :final if token.nil?
+
+    case token
+    when '*'
+      :wildcard
+    else
+      :literal
+    end
+  end
+
+  def self.debug(state, sequence_pos, pattern_pos, sequence, pattern)
+    return unless ENV['DEBUG']
+
+    puts [state].inspect
+    puts "  " + (" " * sequence_pos) + "v"
+    puts "  " + sequence
+    puts "  " + (" " * pattern_pos) + "v"
+    puts "  " + pattern
+  end
+
+  # start, literal, wildcard, final
+  def self.run(sequence, pattern)
+    state = :start
+    sequence_pos = 0
+    pattern_pos = 0
+    result = nil
+
+    while pattern_pos < pattern.size && sequence_pos < sequence.size
+      debug(state, sequence_pos, pattern_pos, sequence, pattern)
+
+      case state
+      when :start
+        pattern_pos = 0
+        result = sequence_pos
+        state = state_for(pattern[pattern_pos])
+      when :literal
+        if sequence[sequence_pos] == pattern[pattern_pos]
+          pattern_pos += 1
+          state = state_for(pattern[pattern_pos])
+        else
+          state = :start
+          result = nil
+        end
+
+        sequence_pos += 1
+      when :wildcard
+        lookahead = pattern[pattern_pos + 1]
+        if sequence[sequence_pos] == lookahead
+          state = state_for(lookahead)
+          pattern_pos += 1
+        else
+          sequence_pos += 1
+        end
+      when :final
+        break
+      end
+    end
+
+    result
+  end
 end
 
 assert_equal 0, Solution.run('abcdef', 'a*d*f')
-assert_equal 1, Solution.run('abcddef', 'bc*de')
-assert_equal 1, Solution.run('abcd', 'b*d')
-assert_equal 2, Solution.run('abacd', 'ac*')
 assert_equal 0, Solution.run('abcdefg', 'a*d*f')
-assert_equal 3, Solution.run('xyzabcdef', 'a*d*f')
 assert_equal 0, Solution.run('abcdefxyz', 'a*d*f')
 assert_equal 0, Solution.run('mo is the best', 'm* is the ****')
+assert_equal 1, Solution.run('abcd', 'b*d')
+assert_equal 1, Solution.run('abcddef', 'bc*de')
+assert_equal 2, Solution.run('abacd', 'ac*')
+assert_equal 3, Solution.run('xyzabcdef', 'a*d*f')
 assert_equal 7, Solution.run('Phone: +1(403)-555-5555', '+*(***)-***-****')