zoukankan      html  css  js  c++  java
  • 241. Different Ways to Add Parentheses

    package LeetCode_241
    
    import java.util.*
    import kotlin.collections.ArrayList
    
    /**
     * 241. Different Ways to Add Parentheses
     * https://leetcode.com/problems/different-ways-to-add-parentheses/description/
     * 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"
    Output: [0, 2]
    Explanation:
    ((2-1)-1) = 0
    (2-(1-1)) = 2
    
    Example 2:
    Input: expression = "2*3-4*5"
    Output: [-34,-14,-10,-10,10]
    Explanation:
    (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
    
    Constraints:
    1. 1 <= expression.length <= 20
    2. expression consists of digits and the operator '+', '-', and '*'.
     * */
    class Solution {
        /*
        * solution:DFS, Memorization with map, split each char to check it digit or symbol and calculate value with operations from left to right
        * Time:O(n*2^n), Space:O(2^n)
        * */
        fun diffWaysToCompute(expression: String): List<Int> {
            val map = HashMap<String, List<Int>>()
            return dfs(expression, map)
        }
    
        private fun dfs(expression: String, map: HashMap<String, List<Int>>): List<Int> {
            if (map.containsKey(expression)){
                return map.getOrDefault(expression, ArrayList<Int>())
            }
            val values = ArrayList<Int>()
            if (!hasOperations(expression)) {
                //just put digit in values
                values.add(expression.toInt())
            } else {
                for (i in expression.indices) {
                    val c = expression[i]
                    if (!c.isDigit()) {
                        val left = dfs(expression.substring(0, i), map)
                        //substring form current i to the end
                        val right = dfs(expression.substring(i + 1), map)
                        //check each digit from left sub list and right sub list
                        for (l in left) {
                            for (r in right) {
                                when (c) {
                                    '+' -> values.add(l + r)
                                    '-' -> values.add(l - r)
                                    '*' -> values.add(l * r)
                                }
                            }
                        }
                    }
                }
            }
            //save into map for next level
            map.put(expression, values)
            return values
        }
    
        private fun hasOperations(expression: String):Boolean{
            for (c in expression){
                if (c=='+' || c=='-' || c=='*'){
                    return true
                }
            }
            return false
        }
    }
  • 相关阅读:
    Bootstrap表单验证插件bootstrapValidator使用方法整理
    去掉表格前符号
    消除float浮动的影响
    html 让一行文字居中
    java通过各种类型驱动连接数据库
    命令行查看端口
    You can't specify target table 'table' for update in FROM clause
    mysql 添加字段 修改字段为not null
    Js、Jquery定时执行(一次或者重复多次,取消重复)
    c# datetime与 timeStamp(unix时间戳) 互相转换
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/15212906.html
Copyright © 2011-2022 走看看