当前位置: 首页 > news >正文

LeetCode -- Expression Add Operators

题目描述:


Given a string that contains only digits 0-9 and a target value, return all possibilities to add binary operators (not unary) +, -, or * between the digits so they evaluate to the target value.


Examples: 
"123", 6 -> ["1+2+3", "1*2*3"] 
"232", 8 -> ["2*3+2", "2+3*2"]
"105", 5 -> ["1*0+5","10-5"]
"00", 0 -> ["0+0", "0-0", "0*0"]
"3456237490", 9191 -> []


给定一串数,在数字中间插入操作符构成表达式,计算表达式,使得结果等于target。


思路:
由于要考虑多位数的情况,对于数组nums,需要对每一位nums[i](其中i∈[0,n))进行字符串截取: nums.Substr[i,i+1],nums.Substr[i,i+2]...nums.Substr[i,i+n-1],然后对每个字串DFS。


一开始想DFS出所有表达式然后逐个计算的,可是表达式计算本身需要字符串遍历,使用栈和队列求解,因此这个方案不可取;
而是需要在遍历过程中立即计算,对于这个方案,要考虑到不同操作符+,-和*计算时的优先级问题。


1.对于+和-可以直接计算,然后从下一位作为起始进入DFS;
2.而对于*并且之前为+或-,需要恢复上一次+或-的计算值,先计算当前的*,然后再执行之前运算的逆运算。


其次,需要考虑当字符串长度大于1并且首字符为0的情况,直接返回。




参考连接:
http://www.sptzxb.com/oj/2015/09/21/LeetCode-Expression%20Add%20Operators/
http://bookshadow.com/weblog/2015/09/16/leetcode-expression-add-operators/




实现代码:


public class Solution {
    public IList<string> AddOperators(string num, int target) 
    {
        var result = new List<string>();
    	Dfs(target, num, 0, 0, '+', "", ref result);
    	
    	return result;
    }
    
private void Dfs(int target, string num, long current , long prevNum, char prevOp, string s, ref List<string> result)
{
   if (num == "")
   {
   		if(current == target){
			result.Add(s);
		}
		return;
   }
   
	for(var i = 1 ;i <= num.Length; i++)
	{
		var str = num.Substring(0, i);
		
		if(str.Length > 1 && str[0] == '0'){
			return;
		}
		
		long n = long.Parse(str);
		
		var left = num.Substring(i, num.Length - i);
		if(s == ""){
			Dfs(target, left, n, n,'+', str, ref result);
			continue;
		}
		//Console.WriteLine(str + ","+index);
		
		Dfs(target, left, current + n, n,'+', s +"+"+str, ref result);
		Dfs(target, left, current - n, n,'-', s +"-"+str, ref result);
		
		// for '*' operator , execute reverse operation for previous operation
		if(prevOp == '+'){
			Dfs(target, left, current - prevNum + prevNum * n,  prevNum * n, prevOp, s +"*"+str, ref result);
		}
		else if(prevOp == '-'){
			Dfs(target, left, current + prevNum - prevNum * n,  prevNum * n, prevOp, s +"*"+str, ref result);
		}
		else{
		    Dfs(target, left, current * n, n, prevOp, s +"*"+str, ref result);
		}


	}
}


}


相关文章:

  • [Web 开发] 获取页面元素的坐标及大小
  • LeetCode -- First Bad Version
  • 本地SPAN和远程SPAN监控原理
  • LeetCode -- House Robber II
  • 打破传统,实战至上的网管师认证
  • LeetCode -- Invert Binary Tree
  • 使用简单ORM开发框架进行快速开发
  • LeetCode -- Largest Number
  • LeetCode -- Length of last word
  • 编程是一种“组合的艺术”
  • LeetCode -- Majority Element II
  • 3G上网卡招标,华为成最大赢家
  • LeetCode -- Nim Game
  • 近期阅读关注(200905)
  • LeetCode -- Pascal's Triangle II
  • JavaScript-如何实现克隆(clone)函数
  • Android Volley源码解析
  • Bootstrap JS插件Alert源码分析
  • centos安装java运行环境jdk+tomcat
  • Github访问慢解决办法
  • input实现文字超出省略号功能
  • js数组之filter
  • Laravel5.4 Queues队列学习
  • PHP那些事儿
  • Swoft 源码剖析 - 代码自动更新机制
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 搞机器学习要哪些技能
  • 关于字符编码你应该知道的事情
  • 码农张的Bug人生 - 初来乍到
  • 全栈开发——Linux
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 思否第一天
  • 温故知新之javascript面向对象
  • 物联网链路协议
  • 一些关于Rust在2019年的思考
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • 组复制官方翻译九、Group Replication Technical Details
  • !!Dom4j 学习笔记
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • (02)Hive SQL编译成MapReduce任务的过程
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (3)llvm ir转换过程
  • (6)添加vue-cookie
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (vue)页面文件上传获取:action地址
  • (笔试题)合法字符串
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (九)信息融合方式简介
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (十)c52学习之旅-定时器实验
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划