天天AC系列(六):有效的括號

1 題目

LeetCode第20題,這題比較簡單,匹配括號. 在這裏插入圖片描述java

2 棧

這是棧的典型應用,括號匹配,固然不須要直接使用棧,使用一個StringBuilder便可:git

if(s.isEmpty())
   return true;
char a = s.charAt(0);
if (a != '(' && a != '[' && a != '{')
    return false;
StringBuilder t = new StringBuilder();
int len = -1;
for(char c:s.toCharArray())
{
    if(c == '(' || c == '[' || c == '{')
    {
        t.append(c);
        ++len;
    }
    else
    {
        if(len == -1)
            return false;
        char cc = t.charAt(len);
        if(
            (c == ')' && cc != '(')
            ||
            (c == ']' && cc != '[')
            ||
            (c == '}' && cc != '{')
        )
            return false;
        t.deleteCharAt(len--);
    }
}
return len == -1;

首先判斷是否爲空,再判斷第一個字符,而後進入逐個循環判斷,若表示左邊的括號則append,若表示右邊的括號首先判斷len,而後取出len處字符進行判斷是否匹配,不匹配直接返回false,匹配的話則刪除這個字符.最後根據len是否爲-1返回最終結果. 在這裏插入圖片描述github

3 優化

其實就是簡化一下代碼,直接開闢一個大的空間,不須要進行append與delete,只需移動棧頂指針.棧頂指針從1開始,若從0開始的話對於"]"這種狀況會報下標越界錯誤,壓棧就是++p,壓入字符,出棧直接- - p,而後判斷是否匹配便可.app

char[] t = new char[s.length() + 1];
int p = 1;
for (char c : s.toCharArray()) 
{
    if (c == '(' || c == '[' || c == '{')
        t[p++] = c;
    else 
    {
        --p;
        if ((c == ')' && t[p] != '(') || (c == ']' && t[p] != '[') || (c == '}' && t[p] != '{'))
            return false;
    }
}
return p == 1;

在這裏插入圖片描述

4 源碼

github優化

碼雲ui

相關文章
相關標籤/搜索