算法設計與應用基礎: 第三週(2)

241. Different Ways to Add Parentheses

Description Submission Solutions
  • Total Accepted: 39401
  • Total Submissions: 93671
  • Difficulty: Medium
  • Contributors: Admin

Given a string of numbers and operators, return all possible results from computing all the different possible ways to group numbers and operators. The valid operators are +- and *.


解題思路:首先遍歷input字符串,每遇到一個運算符,就分別計算該運算符之前和之後兩部分的可能值res_right和res_left,然後兩層循環這兩個vector,將運算結果放入res中。最後要記得討論若res爲空的情況,即input中只有一個數字,這時直接將該數字加入res(ret.push_back(atoi(input.c_str()));)該方法也是string類轉化爲int/long類的一種常用方法。

class Solution {
public:
    vector<int> diffWaysToCompute(string input) {
                vector<int> ret;
        for(int i = 0; i < input.size(); i ++)
        {
            if(input[i] == '+' || input[i] == '-' || input[i] == '*')
            {
                vector<int> left = diffWaysToCompute(input.substr(0, i));
                vector<int> right = diffWaysToCompute(input.substr(i+1));
                for(int j = 0; j < left.size(); j ++)
                {
                    for(int k = 0; k < right.size(); k ++)
                    {
                        if(input[i] == '+')
                            ret.push_back(left[j] + right[k]);
                        else if(input[i] == '-')
                            ret.push_back(left[j] - right[k]);
                        else
                            ret.push_back(left[j] * right[k]);
                    }
                }
            }
        }
        if(ret.empty())
            ret.push_back(atoi(input.c_str()));
        return ret;
    }

        
    
};
總結:通過計算可知該方法的複雜度爲O(n*3),主要難點就是運用到遞歸使得代碼簡潔(直接算出左右兩部分的子vector),,還有要注意的地方就是遞歸的遞歸的最後情況,只有一個數字了,要最後討論,這是特變要注意的一點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章