iT邦幫忙

2022 iThome 鐵人賽

DAY 1
0

前言:刷題應該每位工程師面試都會遇到的一關,想透過這30天複習一下之前學校所學的內容,至於怎麼挑題完全是看自己的心情,那廢話不多說開始吧!

題目說明:給定一組字串,要你判斷此字串是否為有效的括號(成對且右括號對應到正確的左括號;例如"("要對應到")","{"要對應到"}")

Case 1
Input: s = "()"
Output: true。原因:有一左一右的括號

Case 2
Input: s = "()[]{}"
Output: true。原因:有三組括號都符合

Case 3
Input: s = "(]"
Output: false。原因:"("對應到的是")"

解題思路:括號匹配的問題,就是用到Stack進行處理,以下附上程式碼以及註解。

這邊順便複習一下Stack的特性以及功能:

  1. LIFO:Last In First Out,先進後出
  2. Push:將元素放入stack裡面。例如原本為空的stack, push 1 之後stack會變成1,再push 2之後stack會變成1,2,以此類推。
  3. Pop:將stack中最後一個元素移除掉。例如一組stack為1,2,3,4,5,6,pop後將會把6移除掉,stack會變成1,2,3,4,5
  4. Top:也可稱之為peek。回傳stack中最後一個元素但不會將其刪除掉。例如一組1,2,3,4,5,6的stack用top(peek)後回傳6,stack依舊是1,2,3,4,5,6
  5. Size:stack的長度。例如一組1,2,3的stack,它的size=3
  6. isEmpty:stack的size是否等於0

Java

class Solution {
    public boolean isValid(String s) {
         Stack<Character> stack = new Stack<>();//建立一個stack儲存char
    for (int i = 0; i < s.length(); i++) {//從字串中的第一個到最後一個字進行遍歷
        char ch = s.charAt(i);//在第i個的字元
        if (ch == '(' || ch == '[' || ch == '{') {
            stack.push(ch);//遇到左括號類型,放入stack中
        } else { 
            if (stack.isEmpty()) {
                return false;//如果都沒有元素,一定是錯的
            }
            if (ch == ')' && stack.peek() != '(') {
                return false;//左括號對應到正確的右括號,例如"([)]就是錯的
            }
            if (ch == ']' && stack.peek() != '[') {
                return false;//同上
            }
            if (ch == '}' && stack.peek() != '{') {
                return false;//同上
            }
            stack.pop();//對應到正確的右括號就pop出去
        }
    }
    return stack.isEmpty();//若stack最後size=0則這組字串是符合括號匹配的特性
}
}

Python

class Solution:
    def isValid(self, s: str) -> bool:
        l=[]
        for i in s:
            if i=='(' or i=='[' or i=='{':
                l.append(i)#左括號類型的push
            else:
                if len(l)==0:
                    return False#都沒有左括號一定是錯的
                elif i==')' and l[-1]=='(':
                    l.pop()#對應到正確的右括號
                elif i==']' and l[-1]=='[':
                    l.pop()#對應到正確的右括號
                elif i=='}' and l[-1]=='{':
                    l.pop()#對應到正確的右括號
                else:
                    return False
        return len(l)==0

下一篇
Day 2 Search Insert Position
系列文
從leetcode學習資料結構和演算法31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言