给表达式添加运算符

给定一个仅包含数字 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"]

class Solution {
public:
    vector<string> addOperators(string num, int target) {
        vector<string> result;
        addOperatorsDFS(num, target, 0, 0, "", result);
        return result;
    }
    //lastOperaNum上一次添加的操作数(用于*法回退)
    void addOperatorsDFS(string num, int target, long long lastOperaNum, long long curNum, string tempRes, vector<string> &result) {
        if (num.size() == 0 && curNum == target) {//此次运算符添加成功
            result.push_back(tempRes);
            return;
        }
        //对添加运算符的位置穷举
        for (int i = 1; i <= num.size(); ++i)
        {
            string cur = num.substr(0, i);
            if (cur.size() > 1 && cur[0] == ‘0‘) {//剪枝   cur不能出现“012”这种,即不能出现前导零
                return;
            }
            string next = num.substr(i);//cur之后的字符串
            if (tempRes.size() > 0) {//如果cur不是第一个操作数
                //尝试添加加,这次添加的操作数lastOperaNum == stoll(cur)
                addOperatorsDFS(next, target, stoll(cur), curNum + stoll(cur), tempRes + "+" + cur, result);
                //尝试添加减,这次添加的操作数lastOperaNum == -stoll(cur)
                addOperatorsDFS(next, target, -stoll(cur), curNum - stoll(cur), tempRes + "-" + cur, result);
                //尝试添加乘
                //由于乘法的优先级比加、减法高,所以需要回退到上一步,即把上一步的操作数与乘法进行运算
                //这次添加的操作数lastOperaNum == lastOperaNum * stoll(cur)
                //(curNum - lastOperaNum)是退回上一次的操作数,然后在进行乘法运算   + lastOperaNum * stoll(cur)
                addOperatorsDFS(next, target, lastOperaNum * stoll(cur), (curNum - lastOperaNum) + lastOperaNum * stoll(cur), tempRes + "*" + cur, result);
            }
            else {//如果是第一个操作数
                addOperatorsDFS(next, target, stoll(cur), stoll(cur), cur, result);
            }
        }
    }
};

原文地址:https://blog.51cto.com/14127742/2394650

时间: 2024-11-13 04:35:06

给表达式添加运算符的相关文章

Leetcode 282.给表达式添加运算符

给表达式添加运算符 给定一个仅包含数字 0-9 的字符串和一个目标值,在数字之间添加二元运算符(不是一元)+.- 或 * ,返回所有能够得到目标值的表达式. 示例 1: 输入: num = "123", target = 6 输出: ["1+2+3", "1*2*3"] 示例 2: 输入: num = "232", target = 8 输出: ["2*3+2", "2+3*2"] 示例

282 Expression Add Operators 给表达式添加运算符

给定一个仅包含0-9的字符串和一个目标值,返回在数字之间添加了二元运算符(不是一元的) +.-或*之后所有能得到目标值的情况.例如:"123", 6 -> ["1+2+3", "1*2*3"] "232", 8 -> ["2*3+2", "2+3*2"]"105", 5 -> ["1*0+5","10-5"]&

JavaWeb学习之JSP常用标签、EL表达式的运算符、JSTL标签库(6)

1.JSP常用标签 * 只要支持JSP文件,常用标签有可以直接使用 * 格式: jsp:xxxx * jsp:forward ,完成jsp页面的转发 * page属性:转发的地址 <% request.setCharacterEncoding("UTF-8"); %> <jsp:forward page="/index.jsp"> <jsp:param value="张三" name="userName&q

PHP_零基础学php_2变量、预定义变量、预定义常量、表达式、运算符、程序控制流程

1.变量 PHP中使用$后跟变量名表示一个变量,变量名区分大小写. 变量的数据类型 整数类型 浮点类型 字符串类型 布尔类型 数组类型 对象 <html> <head> <title>php</title> </head> <body> /* 整数类型:可以在php中指定的整数包括十进制.八进制.和十六进制,整形数值前可以加上符号“+”或“-” */ $i=2468;//指定一个十进制整数 $i=-2468;//指定一个十进制负数 $

让我们来看一看C++ 三.表达式与运算符

所谓表达式,就是由数字.运算符号.约束变量等以能求得数值的有意义的排列方式形成的组合,我们平时说的算式,去掉得数和等号后就是一个表达式. 变量.数字什么的,看过第二章的读者应该都懂了,我这里要讲的是运算符号. 在我们日常生活中,运算符号不外乎+ - × ÷ 一类,在C++中,可以直接完成的运算有五种,分别是加法(+).减法(-).乘法(*).整除(/)和去余(%). 首先乘法并不是用×来表示的,这是因为,那个符号在我们使用的各式各样的键盘配位中,都是一个很难打出的符号,而*只需要左手左移,右手上

JavaScript&amp;jQuery.表达式与运算符

表达式与运算符 表达式 表达式可以求一个值,求值的过各可以包含运算. var length=80 表达式中可以使用两个或多个值,表达式最终返回一个值.如求桌子的面积. var area=80*60 操作符 表达中需要使用操作符,操作是对一个或多个值进行运算,得到一个值. 常用的操作符有:赋值操作符.比较操作符.算术操作符.逻辑操作符.字符串操作符. 算术操作符 算术操作符同数学学的差不多,在数值计算中用得非常多. 加法            +               将一个值和另一个值相加

Python表达式与运算符

表达式与运算符 Python语言支持以下类型的运算符: 算术运算符 比较(关系)运算符 赋值运算符 逻辑运算符 位运算符 成员运算符 身份运算符 运算符优先级 算术运算符 运算符 描述 + 加 - 两个对象相加 - 减 - 得到负数或是一个数减去另一个数 * 乘 - 两个数相乘或是返回一个被重复若干次的字符串 / 除 - x除以y % 取模 - 返回除法的余数 ** 幂 - 返回x的y次幂 // 取整除 - 返回商的整数部分 比较运算符 运算符 描述 == 等于 - 比较对象是否相等 != 不等

JavaScript学习----------表达式、运算符和优先级

表达式.运算符和优先级 '5' + 5 ---> 55 '5' - 5 --->  0 4 / 3 ---> 1.333333 4 / 0 ---> infinity 0 / 0 ---> NaN 4 % 0 ---> NaN 0 % 0 ---> NaN '25'<4 ---> false ------和第二个减号的挺像,把字符串给转成数字作比较. false == 0 ---> true true == 1 ---> true true

四、C#入门—表达式与运算符

四.C#表达式与运算符 4.1.表达式 操作数+运算符 4.2.数学运算符 var1=+var2 var1乘以1 var1=-var2 var1乘以-1 var++ 先用后加 ++var 先加后用 4.3.赋值运算符 略 4.4.关系运算符 结果只会是bool类型 1)对象的不同 数值类型比较两个数的大小 字符类比较Unicode编码大小,'A'=65 'a'=97 '0'=48 字符串只能用 == 或 != 4.5.逻辑运算符 结果只会是bool类型 &&与 ||或  !非 注:当表达式