In this Leetcode Expression Add Operators problem solution we have given a string num that contains only digits and an integer target, return all possibilities to add the binary operators '+', '-', or '*' between the digits of num so that the resultant expression evaluates to the target value.
Problem solution in Python.
class Solution(object): def addOperators(self, num, target): """ :type num: str :type target: int :rtype: List[str] """ if not num: return [] ans = [num[0]] ams = [[int(num[0])]] for n in range(1,len(num)): temp = [] tenp = [] for i,a in enumerate(ans): temp.append(a+"+"+num[n]); tenp.append(ams[i]+[int(num[n])]) temp.append(a+"-"+num[n]); tenp.append(ams[i]+[-int(num[n])]) temp.append(a+"*"+num[n]); tamsa = [b for b in ams[i]] tamsa[-1]*= int(num[n]) tenp.append(tamsa) if a[-1]!= "0" or (len(a)>1 and a[-2].isalnum()): temp.append(a+""+num[n]); tams = [b for b in ams[i]] tams[-1]= tams[-1]*10+int(num[n]) tenp.append(tams) ans = temp ams = tenp # print(ans, ams) aans = [] for i,a in enumerate(ans): if sum(ams[i])==target: aans.append(a) return aans
Problem solution in Java.
class Solution { int n; String num; List<String> list; public List<String> addOperators(String num, int target) { n = num.length(); this.num = num; list = new ArrayList<>(); if(n>0){ f(0,target,1,1,num.charAt(0)-'0',"" + num.charAt(0)); } return list; } void f(int i,long target,int c,long x,long y,String expr){ if(i==n-1){ if(target == c*x*y){ list.add(expr); } return; } int p = num.charAt(i+1) - '0'; long prd = y*x; f(i+1,target ,c,prd,p,expr + "*" + num.charAt(i+1)); f(i+1,target - prd*c,1, 1,p,expr + "+" + num.charAt(i+1)); f(i+1,target - prd*c,-1, 1,p,expr + "-" + num.charAt(i+1)); if(y!=0){ f(i+1,target, c,x, 10*y + p,expr + num.charAt(i+1)); } } }
Problem solution in C++.
class Solution { public: vector<string> addOperators(string num, long long target) { _number = std::move(num); if (!_number.empty()) { _buffer.resize(_number.size()); tryAddSymbol(0, 0, -target, 1, _number[0] - '0'); } return move(_result); } private: void addResultString() { string str; for (size_t i = 0; i < _buffer.size(); ++i) { if (_buffer[i]) { str += _buffer[i]; } str += _number[i]; } _result.push_back(std::move(str)); } void tryAddSymbol(char symbol, size_t index, long long value1, long long value2, long long value3) { _buffer[index++] = symbol; if (index != _number.size()) { const auto digit = _number[index] - '0'; tryAddSymbol('+', index, value1 + value2 * value3, 1, digit); tryAddSymbol('-', index, value1 + value2 * value3, -1, digit); tryAddSymbol('*', index, value1, value2 * value3, digit); if (value3) { tryAddSymbol('\0', index, value1, value2, 10 * value3 + digit); } } else if (value1 + value2 * value3 == 0) { addResultString(); } } private: std::string _number; std::vector<char> _buffer; vector<string> _result; };
0 Comments