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
        }
    }
  • 相关阅读:
    利用.Net的CLR和BCL实现函数IsNumeric
    30岁前挣到10万年薪 五位年轻人的高薪秘诀
    三级关链菜单通用版
    对Session和Cookie的区分与理解
    转贴:C#排序算法大全
    无效的 CurrentPageIndex 值.它必须大于等于 0 且小于 PageCount!的问题
    ASP.NET中“检测到有潜在危险的表单值”的解决方法
    如何让网页版面更适合浏览者呢?这里有技巧
    十二星座情侣恋爱积分
    asp.net 三种基本的参数传递方法(web forms)
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/15212906.html
Copyright © 2011-2022 走看看