Leetcode(20)-有效的括號


給定一個只包括 '('')''{''}''['']' 的字符串,判斷字符串是否有效。

有效字符串需滿足:

  1. 左括號必須用相同類型的右括號閉合。
  2. 左括號必須以正確的順序閉合。

注意空字符串可被認為是有效字符串。

自己算法思路:首先判斷字符串是否為空,如果為空,直接認為是有效字符串,返回true;然后利用stack的數據結構來解題,逐個判斷字符串,如果是左括號,就打入棧中,如果是右括號,判斷棧是否為空,為空則返回false,再判斷棧頂是不是對應的左括號,如果是,則將棧頂的元素出棧,如果不是,則返回false。

bool isValid(string s)
{
    if(s.empty()) return true;
    stack<char> sta;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]=='(' || s[i]=='[' || s[i]=='{')
        {
            sta.push(s[i]);
        }
        else if(sta.empty()) { return false; } else if((s[i] == ')' && sta.top()=='(') ||(s[i] == ']' && sta.top()=='[')||(s[i] == '}' && sta.top()=='{'))
        {
            sta.pop();
        }
        else
            return false;
    }
    if(sta.empty())
        return true;
    else
        return false;
}

算法缺陷:因為每次只打入左括號,如果第一個就是右括號,則要先判斷棧是否為空,否則訪問棧頂元素則會出錯。這樣判斷情況太多,不夠簡潔。

bool isValid(string s) {
        stack<char> result;  
        int n=s.size();  
        if(n==0) return true;  
     for(int i=0;i<n;i++)  
            {  
                if(result.empty())  
                    result.push(s[i]);  
                else if(result.top()=='('&&s[i]==')'||  
                      result.top()=='['&&s[i]==']'||  
                      result.top()=='{'&&s[i]=='}')   
                        result.pop();  
                else  
                    result.push(s[i]);  
                  
            }  
            return result.empty(); 
    }

只要棧中的元素為空,就入棧,而且棧頂和目前的元素無法配對的時候,同樣打入棧中,這樣避免了一開始就是右括號,不入棧,接下來要訪問棧頂的尷尬,其余思路和上面的一樣,最后只需要判斷棧中是不是為空就好了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM