1. 程式人生 > >每天一道LeetCode-----對錶達式新增括號並求值,返回所有可能的計算結果

每天一道LeetCode-----對錶達式新增括號並求值,返回所有可能的計算結果

Different Ways to Add Parentheses

這裡寫圖片描述

給出一個只有加,減,乘運算的表示式,要求在這個表示式中新增合理的括號,返回所有填上括號後的計算結果

考慮每一個操作符(+, -, *),每一個操作符實際上是將表示式分成了左右兩部分。

211為例,第一個”-“將表示式分成了兩部分,分別是211,那麼就可以假定新增括號的結果是(2)(11)

同樣的對左右兩邊進行處理

(2)不能再拆分,直接返回

(11)中仍然有一個操作符,又分成左右兩部分,分別是11,那麼就可以嘉定新增括號的結果是(1)(1)

繼續對左右兩邊進行處理,都不能繼續拆分,直接返回

可以發現,到最後面,整個表示式都被拆分成一個個數,然後逐層向上返回,根據操作符的不同進行將左右兩邊返回的結果進行不同的運算,繼續向上返回

程式碼如下

class Solution {
public:
    vector<int> diffWaysToCompute(string input) {
        vector<int> res;
        for(int i = 0; i < input.size(); ++i)
        {
            //如果是操作符,就將左右兩邊分開
            if(isOperator(input[i]))
            {
                //返回左邊和右邊的所有可能結果
vector<int> lhs = diffWaysToCompute(input.substr(0, i)); vector<int> rhs = diffWaysToCompute(input.substr(i + 1)); //依次組合,因為返回之前考慮了為空的情況,所以這裡無需判斷是否為空 for(auto n1 : lhs) { for(auto n2 : rhs) { if
(input[i] == '+') res.emplace_back(n1 + n2); else if(input[i] == '-') res.emplace_back(n1 - n2); else res.emplace_back(n1 * n2); } } } } if(res.empty()) { //可以新增一條語句判斷input是空字元的情況 //if(input.empty()) input.append(1, '0'); int n = 0; sscanf(input.c_str(), "%d", &n); res.emplace_back(n); } return res; } private: bool isOperator(char op) { return op == '+' || op == '-' || op == '*'; } };

本題主要還是遞迴,將大問題轉換為左右兩個小問題,進而求解

以前還遇到過只需要將所有加括號的情況返回的,忘記在哪了:cry: