classSolution{public:vector<string>addOperators(stringnum,inttarget){vector<string>ans;dfs(num,target,0,0,0,{},ans);returnans;}private:stringjoin(constvector<string>&path){stringjoined;for(conststring&s:path)joined+=s;returnjoined;}// Start index, prev value, current evaluated valuevoiddfs(conststring&num,inttarget,intstart,longprev,longeval,vector<string>&&path,vector<string>&ans){if(start==num.length()){if(eval==target)ans.push_back(join(path));return;}for(inti=start;i<num.length();++i){if(i>start&&num[start]=='0')return;conststring&s=num.substr(start,i-start+1);constlongcurr=stol(s);if(start==0){path.push_back(s);dfs(num,target,i+1,curr,curr,move(path),ans);path.pop_back();}else{for(conststring&op:{"+","-","*"}){path.push_back(op+s);if(op=="+")dfs(num,target,i+1,curr,eval+curr,move(path),ans);elseif(op=="-")dfs(num,target,i+1,-curr,eval-curr,move(path),ans);elsedfs(num,target,i+1,prev*curr,eval-prev+prev*curr,move(path),ans);path.pop_back();}}}}};
classSolution{publicList<String>addOperators(Stringnum,inttarget){List<String>ans=newArrayList<>();dfs(num,target,0,0,0,newStringBuilder(),ans);returnans;}privatevoiddfs(Stringnum,inttarget,ints,longprev,longeval,StringBuildersb,List<String>ans){if(s==num.length()){if(eval==target)ans.add(sb.toString());return;}for(inti=s;i<num.length();++i){if(i>s&&num.charAt(s)=='0')return;finallongcurr=Long.parseLong(num.substring(s,i+1));finalintlength=sb.length();if(s==0){// First numdfs(num,target,i+1,curr,curr,sb.append(curr),ans);sb.setLength(length);}else{dfs(num,target,i+1,curr,eval+curr,sb.append("+").append(curr),ans);sb.setLength(length);dfs(num,target,i+1,-curr,eval-curr,sb.append("-").append(curr),ans);sb.setLength(length);dfs(num,target,i+1,prev*curr,eval-prev+prev*curr,sb.append("*").append(curr),ans);sb.setLength(length);}}}}
classSolution:defaddOperators(self,num:str,target:int)->List[str]:ans=[]# Start index, prev value, current evaluated valuedefdfs(start:int,prev:int,eval:int,path:List[str])->None:ifstart==len(num):ifeval==target:ans.append(''.join(path))returnforiinrange(start,len(num)):ifi>startandnum[start]=='0':returns=num[start:i+1]curr=int(s)ifstart==0:path.append(s)dfs(i+1,curr,curr,path)path.pop()else:foropin['+','-','*']:path.append(op+s)ifop=='+':dfs(i+1,curr,eval+curr,path)elifop=='-':dfs(i+1,-curr,eval-curr,path)else:dfs(i+1,prev*curr,eval-prev+prev*curr,path)path.pop()dfs(0,0,0,[])returnans