程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 筆試題35. LeetCode OJ (22)

筆試題35. LeetCode OJ (22)

編輯:關於C++

vczixL+1xLLiytTTw8D9o6zO0rXEtdrSu7e006bKx9Gtu7ejrNLyzqrO0rbU0a27t7HIvc/D9LjQsMmjrMv50tTO0tPD0a27t9C0wcvSu8/Co6y1q8rHztK3os/Wo6xuPTK1xMqxuvK63LzytaW+zdC0s/bBy7T6wuujrLWrysduPTO1xMqxuvK+zdPQtePC6bezwcujrLWxbj00tcTKsbryLS0tLS0tLS3O0rjQvvW088TU0qrVqMHLLi4uCiAgINXiy7XD98HL1eK49su8wreyu9DQo6yx2NDru7vW1su8wrfIpb3izOKjrMv50tTO0rj419S8utK7uPZuJiMyMDU0MDstLS0tLS0tLSBuPTEwMCCjobrDsMmjrM7StcO13bnpoaM8L3A+CjxwPrXduem1xLe9t6jSssrH09C8vMfJtcSjrA=="(' 和 ')' 的數目有限,我們可以利用這一點,所以我使用了left和right兩個計數器,用來統計'(' 和 ')' 的數目,每次給字符串後面添加了一個'(',left 的值就減少1 ------- 當left=0的時候,直接就可以給字符串後面補上right個 ')' ,這就是一種匹配的情況了。

添加了 '(' 完成後遞歸後,我們可以把之前放‘(’的位置放上 ')' 去遞歸。

**需要注意 right > left 在整個過程中要一直成立

因為‘())’這樣的情況是不允許發生的,不知道大家看懂了沒有。再舉個例子說明一下吧:

假設當前string 中的字符串為 "()" 這個時候,即: left==right 這個時候只能給它後面加上 '(' 而不能是 ')'

但是當string 中的字符串為 "(()" 或者 "()(" 的個時候,此時 right>left 我們可以在最後面添加上 ')' 去遞歸。

不知道上面的講解大家能看懂不,不懂的話,請看看代碼幫助你理解一下吧:

class Solution {
public:
	vector generateParenthesis(int n)
	{
		vector last;
		if (n <= 0)
		{
			return last;
		}
		int left = n - 1, right = n;
		string tmp = "(";
		//遞歸去發現符合條件的情況
		solve(last, tmp, left, right);
		return last;
	}
	
	void solve(vector&last, string tmp, int left, int right)
	{
		if (left == 0)
		{
			while (right)
			{
				tmp.push_back(')');
				--right;
			}
			last.push_back(tmp);
			return;
		}
		tmp.push_back('(');
		solve(last, tmp, left - 1, right);
		if (right > left)
		{//只有這種情況下,才能給tmp的後面加上 ‘)’,否則不行
			tmp.pop_back();
			tmp.push_back(')');
			solve(last, tmp, left, right - 1);
		}
	}
};
代碼的執行結果如下:


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved