1. 程式人生 > >leetcode 20-Valid Parentheses

leetcode 20-Valid Parentheses

原題:

Given a string containing just the characters '('')''{''}''[' and ']', determine if the input string is valid.

The brackets must close in the correct order, "()" and "()[]{}" are all valid but "(]" and "([)]" are not.

即判斷一串括號是否匹配。

思路:

這是一個可以用棧(stack)來解決的經典問題,具體可以按照如下幾步來實現:

1. 設輸入的一串括號為s,如果s為空,則返回false。如果s長度為奇數,則必然無法匹配,同樣返回false。

2. 將s的第一個字元壓入棧,開始遍歷s, 並迴圈執行下面的操作。

3. 如果此時棧為空,則分兩種情況:

—— 3.1當前字元屬於左括號,則將其入棧。

—— 3.2當前字元屬於右括號,則s必然無法匹配,直接返回false。

4. 如果此時棧不為空,又分為如下幾種情況:

—— 4.1 如果s的當前字元與棧頂元素可以匹配成一對括號,則將棧頂元素出棧。

—— 4.2 如果不匹配,則分為兩種情況:

———— 4.2.1 如果s當前字元屬於左括號,則將其入棧。 

———— 4.2.2 如果s當前字元屬於右括號,則直接返回false。

5. 遍歷完s,如果發現此時棧為空,說明s中的括號完全匹配,返回true,否則返回false。

根據上述思路,可以輕鬆寫出下面的Java程式碼(使用了Java Util中自帶的Stack類)

程式碼(Java):

public class Solution 
{
    boolean isMatch(char top, char target)  //輔助函式 判斷兩個括號是否匹配
    {
        if(top=='(' && target==')')
        {
            return true;
        }
        else if(top=='[' && target==']')
        {
             return true;
        }
        else if(top=='{' && target=='}')
        {
             return true;
        }
        else
        {
            return false;
        }
    }
    
    
    boolean isLeft( char target)    //輔助函式 判斷括號是否為左括號
    {
        if(target=='('||target=='['||target=='{')
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    
    boolean isRight( char target)   //輔助函式 判斷括號是否為右括號
    {
        if(target==')'||target==']'||target=='}')
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    
    
    public boolean isValid(String s) 
    {
            if(s.equals("")||s==null)
            {
                return false;
            }
            int length = s.length();
            if(length%2==1)
            {
                return false;
            }
            
            Stack<Character> temp = new Stack<Character>();
            int i = 0;
            
            while(i < length)
            {
                char target = s.charAt(i);
                if(temp.isEmpty())  //如果棧為空,並且為左括號,則壓棧,否則必定無法匹配,返回false
                {
                    if(isLeft(target))
                    {
                        temp.push(target);
                    }
                    else
                    {
                        return false;
                    }
                }
                else
                {
                    char top = temp.peek();
                  
                    if(isMatch(top,target))    //如果匹配,則棧頂出棧
                    {
                        temp.pop();
                    }
                    else if(isLeft(target))  //如果不匹配,當前括號為左括號則壓棧
                    {
                       temp.push(target);
                    }
                    else        //如果不匹配,當前括號為右括號則返回false
                    {
                        return false;
                    }
                    
                }
                ++i;
            }
            
            if(temp.isEmpty())
            {
                return true;
            }
            return false;
    }
}