How to balance parenthesis recursively

后端 未结 9 1314
走了就别回头了
走了就别回头了 2021-01-31 23:56

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

相关标签:
9条回答
  • 2021-02-01 00:20
      val myStack = new Stack[Char]
    
      def balance(chars: List[Char]): Boolean = {
        def processParanthesis(x: Char, a: List[Char]): Stack[Char] = {
          if (x == '(') {
            myStack.push('(');
          } else if (x == ')') {
            if (!myStack.empty())
              myStack.pop();
            else
              myStack.push(')');
          }
          if (a.length == 0)
            return myStack;
          else
            return processParanthesis(a.head, a.tail);
        }
        return processParanthesis(chars.head, chars.tail).empty();
      }
    
    0 讨论(0)
  • 2021-02-01 00:31

    My solution for this

    def balance(chars: List[Char]): Boolean = {
     var braceStack = new Stack[Char]()
    
    def scanItems(strList:List[Char]):Boolean = {
       if(strList.isEmpty)
           braceStack.isEmpty
       else{
          var item = strList.head
          item match {
            case '(' => braceStack.push(item)
                        scanItems(strList.tail)
            case ')'=> if(braceStack.isEmpty){
                            false
                        }
                        else {
                          braceStack.pop
                          scanItems(strList.tail)
                        }
            case _ => scanItems(strList.tail)
          }
        }
     }
    
     scanItems(chars)
    

    }

    0 讨论(0)
  • 2021-02-01 00:36

    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 :

    object Balance {
    
      def main(args: Array[String]): Unit = {
        var paranthesis = "(234(3(2)s)d)" // Use your string here
        println(bal(paranthesis.toList)) // converting the string to List 
      }
    
      def bal(chars: List[Char]): Boolean ={
       // var check  = 0
        def fun(chars: List[Char],numOfOpenParan: Int): Boolean = {
          if(chars.isEmpty){
            numOfOpenParan == 0
          }
          else{
            val h = chars.head
    
            val n = 
              if(h == '(') numOfOpenParan + 1
              else if (h == ')') numOfOpenParan - 1
              else numOfOpenParan 
    
           // check  = check + n
            if (n >= 0) fun(chars.tail,n)
            else false 
          }
        }
        fun(chars,0)
      }
    }
    
    0 讨论(0)
  • 2021-02-01 00:36

    Adding to Vigneshwaran's answer (including comments & filtering unnecessary letters to avoid extra recursive calls):

    def balance(chars: List[Char]): Boolean = {
      @scala.annotation.tailrec
      def recurs_balance(chars: List[Char], openings: Int): Boolean = {
        if (chars.isEmpty) openings == 0
        else if (chars.head == '(') recurs_balance(chars.tail, openings + 1)
        else openings > 0 && recurs_balance(chars.tail, openings - 1)
      }
    
      recurs_balance(chars.filter(x => x == '(' || x == ')'), 0)
    }
    
    0 讨论(0)
  • 2021-02-01 00:37

    It seems we are attending the same course. my solution:

    def balance(chars: List[Char]): Boolean = 
    doBalance(chars, 0) == 0;
    def doBalance(chars: List[Char], parenthesisOpenCount: Int): Int =
    if(parenthesisOpenCount <0) -100;
    else
    if(chars.isEmpty) parenthesisOpenCount
    else
      chars.head match {
      case '(' => return doBalance(chars.tail, parenthesisOpenCount+1) 
      case ')' => return doBalance(chars.tail, parenthesisOpenCount-1)
      case _ => return doBalance(chars.tail, parenthesisOpenCount)
    }
    
    0 讨论(0)
  • 2021-02-01 00:38

    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.

    def balance(chars: List[Char]): Boolean = {
        def balanced(chars: List[Char], open: Int): Boolean = 
          if (chars.isEmpty) open == 0
          else if (chars.head == '(') balanced(chars.tail, open + 1)
          else if (chars.head == ')') open > 0 && balanced(chars.tail, open - 1)
          else balanced(chars.tail, open)
        balanced(chars, 0)
    }
    
    0 讨论(0)
提交回复
热议问题