zoukankan      html  css  js  c++  java
  • LeetCode-Different Ways to Add Parentheses

    Given a string of numbers and operators, return all possible results from computing all the different possible ways to group numbers and operators. The valid operators are +, - and *.


    Example 1

    Input: "2-1-1".

    ((2-1)-1) = 0
    (2-(1-1)) = 2

    Output: [0, 2]


    Example 2

    Input: "2*3-4*5"

    (2*(3-(4*5))) = -34
    ((2*3)-(4*5)) = -14
    ((2*(3-4))*5) = -10
    (2*((3-4)*5)) = -10
    (((2*3)-4)*5) = 10

    Output: [-34, -14, -10, -10, 10]

    Credits:
    Special thanks to @mithmatt for adding this problem and creating all test cases.

    Solution:

    public class Solution {
        HashSet<Character> operators;
        
        public List<Integer> diffWaysToCompute(String input) {
            operators = new HashSet<Character>();
            operators.add('+');
            operators.add('-');
            operators.add('*');
            return diffWaysRecur(new StringBuilder().append(input),0,input.length()-1);
        }
        
        // Count different ways to compute sArr[start...end]
        public List<Integer> diffWaysRecur(StringBuilder sArr, int start, int end){
            List<Integer> resList = new ArrayList<Integer>();
            
            // find the first operator.
            int p1 = start;
            while (p1<=end && !operators.contains(sArr.charAt(p1))){
                p1++;
            }
            
            if (p1>end){
                // no operator, return the number.
                resList.add(Integer.parseInt(sArr.substring(start,end+1)));
            }
            
            while (p1<=end){
                // Compute left substring and right substring 
                List<Integer> leftRes = diffWaysRecur(sArr, start, p1-1);
                List<Integer> rightRes = diffWaysRecur(sArr, p1+1, end);
                for (int lVal : leftRes)
                    for (int rVal : rightRes){
                        resList.add(compute(sArr.charAt(p1),lVal,rVal));
                    }
                
                // Looking for next operator.
                p1++;
                while (p1<=end && !operators.contains(sArr.charAt(p1))){
                    p1++;
                }
            }
            
            return resList;
        }
        
        public int compute(char oper, int v1, int v2){
            if (oper == '+') return v1+v2;
            if (oper == '-') return v1-v2;
            if (oper == '*') return v1*v2;
            return 0;
        }
    }
     
  • 相关阅读:
    JavaScript继承
    UML建模概述
    UML建模—EA创建Use Case(用例图)
    UML建模—EA创建Class(类图)
    UML建模—EA的使用起步
    软件设计原则之 单一职责
    docker使用教程
    Fiddler工具使用介绍
    理解Python协程:从yield/send到yield from再到async/await
    如何简单地理解Python中的if __name__ == '__main__'
  • 原文地址:https://www.cnblogs.com/lishiblog/p/5874192.html
Copyright © 2011-2022 走看看