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
}
}