zoukankan      html  css  js  c++  java
  • leetcode刷题笔记282题 给表达式添加运算符

    leetcode刷题笔记282题 给表达式添加运算符

    源地址:282. 给表达式添加运算符

    问题描述:

    给定一个仅包含数字 0-9 的字符串和一个目标值,在数字之间添加二元运算符(不是一元)+、- 或 * ,返回所有能够得到目标值的表达式。

    示例 1:

    输入: num = "123", target = 6
    输出: ["1+2+3", "123"]
    示例 2:

    输入: num = "232", target = 8
    输出: ["23+2", "2+32"]
    示例 3:

    输入: num = "105", target = 5
    输出: ["1*0+5","10-5"]
    示例 4:

    输入: num = "00", target = 0
    输出: ["0+0", "0-0", "0*0"]
    示例 5:

    输入: num = "3456237490", target = 9191
    输出: []

    /*
    整体思路基于回溯思想
    通过维护代数结果 a + b * c
    将 + 变为 a + 1 * _
    将 - 变为 a - 1 * _
    将 * 变为 a + ( b * _)
    */
    import scala.collection.mutable
    import scala.util.control.Breaks.{break, breakable}
    object Solution {
        def addOperators(num: String, target: Int): List[String] = {
            val res = mutable.ListBuffer[String]()
            val path = new Array[Char](100)
            dfs(num, 0, 0, 0, 1, target)
            return res.toList
            
            def dfs(num: String, u: Int, len: Int, a: Long, b: Long, target: Long): Unit = {
                var tLen = len
                //当满足条件时 返回
                if (u == num.length) {
                    if (a == target) {
                        res.append(path.slice(0, len-1).mkString)
                    }
                }
                else {
                    var c: Long = 0
                    breakable{
                        //依次组合数 构成如10这种情况
                        for (i <- u  to num.length-1) {
                            c = c * 10 + num(i) - '0'
                            path(tLen) = num(i)
                            //依次进行加减乘的试探 
                            tLen += 1
                            path(tLen) = '+'
                            dfs(num, i+1, tLen+1, a+b*c, 1, target)
                        	//由于我们将最后一位设置为+
                            //非最后一位的情况下,试探 - 与 *
                            if (i+1 < num.length){
                                path(tLen) = '-'
                                dfs(num, i+1, tLen+1, a+b*c, -1, target)
                            }
                            
                            if (i+1 < num.length){
                                path(tLen) = '*'
                                dfs(num, i+1, tLen+1, a, b*c, target)
                            }
                            //排除0开头的情况
                            if (num(u) == '0') break 
                        }
                    }
                }
            }
            return res.toList
        }
    }
    
  • 相关阅读:
    [LintCode 614.] 二叉树的最长连续子序列 II
    [LintCode 90.] k数和 II
    [LintCode 1674.] 倒可乐
    [LintCode 797.] 到达一个数字
    [LintCode 1691.] 买卖股票的最佳时机V
    [LintCode 69. 242.] 二叉树的层次遍历
    [LintCode 229.] 栈排序
    [LeetCode 1671.] 玩游戏
    [LintCode 1668.] 区间最小覆盖
    (十)线程同步
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/13972058.html
Copyright © 2011-2022 走看看