Home > OS >  Finding a valid substring
Finding a valid substring

Time:12-24

I am a bit puzzled by one exercise I recently came across with.

It seems like an easy task and I've put my solution but it turned out it didn't pass all the tests :D

In the example, I've found two example substrings:

Input: S = "(()("
Output: 2
Explanation: The longest valid 
substring is "()". Length = 2.

and

Input: S = "()(())("
Output: 6
Explanation: The longest valid 
substring is "()(())". Length = 6.

at the first glance, everything is clear.

I came up with my solution:

class Solution {

  findMaxLen(s) {
    if (!s || !s.length) throw new Error('Invalid input value provided')

    let openIndex = null
    let closingIndex = null

    for (let i = 0; i < s.length; i  ) {
      if (s[i] == '(' && !openIndex) openIndex = i   1
      if (s[i] == ')') closingIndex = i   1
    }

    if(!closingIndex || !openIndex) throw new Error('Invalid substring')

    return closingIndex - openIndex   1
  }
}

So, my solution should solve the issue of trying to find The longest substring with the opening and closing parentheses.

But it failed the test with an input value: (((() Where the correct answer is 2 and my output is 5

Is this (((() different from ()(())( one provided in the example?

I suppose I do not wholly understand the idea of what the substring is or something...

CodePudding user response:

This pseudocode should work. Some bugs or edge cases might have loose ends as I just wrote this here on the fly. Feel free to test it and point out the misses.

helper_stack = null
max_valid_len = 0
running_len = 0

for i=0 to input_s.length:
    if helper_stack.length == 0:
        if input_s[i] == ')':
            running_len = 0
            continue
        else:
            helper_stack.push('(')
    else:
        if input_s[i] == '(':
            helper_stack.push('(')
        else:
            helper_stack.pop()
            running_len  = 2
            if running_len > max_valid_len:
                max_valid_len = running_len

EDIT: Explanation

With your logic, you are not keeping track of order of opening and closing of brackets, which is important. If a closing bracket precedes open, string becomes invaid by default. Hence, using stack makes sense here.

If ever we encounter a closing bracket before open, we restart from that point. Hence, we set the running_len = 0. For every encounter of closing bracket, if an open bracket is there to balance it, we just pop it off, and since its a pair (of chars, when we consider length of string), running_len = 2 is done.

With little modification, we can even reproduce max_valid_substring if needed. However, in our case, we could even use just an integer instead of helper_stack. For every push('(') operation, just do var = 1, and var -= 1 for pop and that should also do the trick. Note that here, we are not explicitly using stack, but this is still conceptually LIFO = last in first out which is basically, stack.

  • Related