Leetcode241.Different Ways to Add Parentheses爲運算表達式設計優先級

給定一個含有數字和運算符的字符串,爲表達式添加括號,改變其運算優先級以求出不一樣的結果。你須要給出全部可能的組合的結果。有效的運算符號包含 +, - 以及 * 。函數

示例 1:指針

輸入: "2-1-1" 輸出: [0, 2] 解釋: ((2-1)-1) = 0 (2-(1-1)) = 2code

示例 2:對象

輸入: "2*3-4*5" 輸出: [-34, -14, -10, -10, 10] 解釋: (2*(3-(4*5))) = -34 ((2*3)-(4*5)) = -14 ((2*(3-4))*5) = -10 (2*((3-4)*5)) = -10 (((2*3)-4)*5) = 10字符串

 

採用了分治的思想和方法。input

分治法就是將一個大規模的問題分紅n個小規模的問題。string

這些問題相互獨立(小問題之間如何解決不會相互影響),且小問題的問題性質與大問題的性質相同。it

經過小問題的解,得出大問題的解。io

 

該問題能夠將長的字符串分紅短的字符串,以運算符爲分界,將字符串一分爲二,以只含單個整數的字符做爲分界的終點。class

由於運算符不止一個,因此若干(1,2,3...)個運算符順序肯定的狀況下,剩下的運算符會有多解的狀況。

 

class Solution {
  public:
	  vector<int> diffWaysToCompute(string input) 
	  {
		  vector<int> res;
		  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 a : left)
				  {
					  for (int b : right)
					  {
						  switch (input[i])
						  {
						  case '+':
							  res.push_back(a + b);
							  break;
						  case '-':
							  res.push_back(a - b);
							  break;
						  default:
							  res.push_back(a * b);
							  break;
						  }
					  }
				  }
			  }
		  }
		  /*if (input.size() == 1)
			  res.push_back((int)(input[0] - '0'));*/
		  if (res.empty())
		  {
			  res.push_back(atoi(input.c_str()));
		  }
		  return res;
	  }
  };

 

附:

string sub = s.substr(5); //只有一個數字5表示從下標爲5開始一直到結尾;

string sub = s.substr(5, 3); //從下標爲5開始截取長度爲3位;
const char *c_str();
c_str()函數返回一個指向正規C字符串的指針常量, 內容與本string串相同. 
這是爲了與c語言兼容,在c語言中沒有string類型,故必須經過string類對象的成員函數c_str()把string 對象轉換成c中的字符串樣式。
int atoi(const char* str)

參數str是要轉換的字符串,返回值是轉換後的整數。
相關文章
相關標籤/搜索