I'm working on some code to balance parenthesis, this question proved most useful for the algorithm.
I implemented it in my first language (PHP) but I'm learning Scala and trying to convert the code.
Here is my PHP code:
function balanced($string) {
return isBalanced($string, "");
}
function isBalanced($chars, $stack) {
if (!strlen($chars))
return empty($stack);
switch ($chars[0]) {
case '(':
// prepend stack with '(', move to next character
return isBalanced(substr($chars, 1), $chars[0] . $stack);
case ')':
// if '(' seen previously, shift stack, move to next character
return !empty($stack) && isBalanced(substr($chars, 1), substr($stack, 1));
default:
// do nothing to stack, move to next character
return isBalanced(substr($chars, 1), $stack);
}
}
I've test this, it works. However, when I convert it to Scala, it fails on balanced strings.
My Scala code:
object Main {
def balance(chars: List[Char]): Boolean = {
def balanced(chars: List[Char], stack: String): Boolean = {
if (chars.isEmpty)
stack.isEmpty
else if (chars.head == ')')
balanced(chars.tail, chars.head + stack)
else if (chars.head == '(')
!stack.isEmpty && balanced(chars.tail, stack.tail)
else
balanced(chars.tail, stack)
}
balanced(chars, "")
}
}
I appreciate this isn't the best Scala code but I'm just starting out. Some tests:
balance("(if (0) false (x))".toList) - fails
balance("profit and loss (P&L).\n(cashflow)".toList) - fails
balance(":)".toList) - passes
balance(")(()".toList) - passes
The PHP equivalent passes all these tests. What have I done wrong in my Scala implementation?
Instead of using Switch case you can use recursion to solve your problem in an efficient way.
Following is my code to achieve the same with the help of recursion. You need to convert the string to List for my method.
Code :
Just for completeness, I found an even more terse 'scala-esque' implementation from another SO question:
Same as Aaron Novstrup's answer but using 'if else'. I'm also attending the same course but we are taught upto if/else only so far.
It seems we are attending the same course. my solution:
My solution for this
}
You have mixed up the cases for
(
and)
.