1. 程式人生 > >有效的括號序列(LintCode)

有效的括號序列(LintCode)

題目來源:LintCode 原題地址:http://www.lintcode.com/zh-cn/problem/valid-parentheses/ 題目:

給定一個字串所表示的括號序列,包含以下字元:'(', ')','{','}','['and']', 判定是否是有效的括號序列。

您在真實的面試中是否遇到過這個題? Yes 樣例

括號必須依照"()"順序表示,"()[]{}"是有效的括號,但"([)]"則是無效的括號。

挑戰

O(n)的時間,n為括號的個數

難度級別:
容易
思路分析: 首先我們需要知道,此題只是讓我們判斷括號序列是否合法,不是表示式是否合法,因此我們就假定只有括號,或者說我們只考慮括號,不考慮其他的字元。
其次,我們知道括號是否有效:
第一,括號要成對出現,例如出現左圓括號('(')n次,則右圓括號(')')也必須出現n次,對於方括號和花括號也是一樣的;
第二,括號可以巢狀,但是從裡到外一定是滿足可以成對抵消的,而不能夠是錯開的,這個從樣例就可以看出來。

那麼我的思路就是借用棧這個資料結構來解此題。
1. 遇到左括號,全部壓入棧中;
2. 遇到右括號,判斷棧頂的元素是否是相對應的左括號,若是則彈出棧頂元素,若不是則返回false,若棧為空,也返回false;

實現程式碼:
#include <iostream>
#include <string>
#include <stack>

using namespace std;

class Solution
{
public:
	/**
	* @param s A string
	* @return whether the string is a valid parentheses
	*/
	bool isValidParentheses(string& s)
	{
		if (s.empty())
			return false;
		stack<char> chStack;
		for (int i = 0; i < s.size(); i++)
		{
			if (whatParent(s[i]) < 0)
			{
				chStack.push(s[i]);
			} else if (whatParent(s[i]) > 0)
			{
				if (chStack.empty())
				{
					return false;
				}
				if (whatParent(chStack.top()) + whatParent(s[i]) == 0)
				{
					chStack.pop();
				} else
				{
					return false;
				}
			}
		}
		if (chStack.empty())
		{
			return true;
		}
		return false;
	}

	int whatParent(char ch)
	{
		switch (ch)
		{
		case '(':
			return -1;
		case ')':
			return 1;
		case '[':
			return -2;
		case ']':
			return 2;
		case '{':
			return -3;
		case '}':
			return 3;
		default:
			break;
		}
		return 0;
	}
};

程式碼說明:
這裡需要說明的是:
我這裡多寫了一個whatParent函式,此函式用來判斷當前字元具體是哪一個括號,返回是一個數字。
這樣,對於成對括號而言,其和為0,給我判斷是否是成對括號這個問題帶來了極大的方便。