• 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
        }
    }
  • 相关阅读:
    CSS中文API
    廖雪峰Git教程
    数据操作的几个名词即model、dal、dao、orm和ar 解释
    Jetty
    Git介绍与使用
    c3p0、dbcp、druid三大连接池对比
    (转)JavaWeb——Servlet(全网最详细教程包括Servlet源码分析)
    08 bash特性--shell脚本编程入门
    07 grep命令与正则表达式
    06 I/O重定向与管道符
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/15212906.html
Copyright © 2020-2023  润新知