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
    }
}
posted @ 2020-11-14 00:44  ganshuoos  阅读(140)  评论(0编辑  收藏  举报