Leetcode 241.为运算表达式设计优先级
比较常规的思路就是对于[l,i]、[i+1,r]两个区间的所有可能结果进行合并。考虑到expression.length <= 20,这样的想法是可以通过的。
int num[23],cnt; int sign[23]; //sign[i]是num[i]后的符号 vector<int> dfs(int l,int r){ vector<int> ans; if (l==r){ ans.push_back(num[l]); return ans; } vector<int> a,b; for (int i=l;i<r;i++){ //分为[l,i]与[i+1,r] a=dfs(l,i); b=dfs(i+1,r); for (int j=0;j<a.size();j++){ for (int k=0;k<b.size();k++){ if (sign[i]==1) ans.push_back(a[j]+b[k]); else if (sign[i]==2) ans.push_back(a[j]-b[k]); else if (sign[i]==3) ans.push_back(a[j]*b[k]); } } } return ans; } class Solution { public: vector<int> diffWaysToCompute(string expression) { memset(num,0,sizeof(num)); memset(sign,0,sizeof(sign)); cnt=0; int lim=expression.size(); expression+='&'; //防止读取越界 for (int i=0;i<lim;i++){ //处理字符串 if ('0'<=expression[i]&&expression[i]<='9'){ if ('0'<=expression[i+1]&&expression[i+1]<='9') num[cnt++]=10*(expression[i]-'0')+(expression[i+1]-'0'),i++; else num[cnt++]=expression[i]-'0'; } else if (expression[i]=='+') sign[cnt-1]=1; else if (expression[i]=='-') sign[cnt-1]=2; else if (expression[i]=='*') sign[cnt-1]=3; } cnt--; if (!cnt){ vector<int> ans; ans.push_back(num[cnt]); return ans; } return dfs(0,cnt); } };
 

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号