前言:刷題應該每位工程師面試都會遇到的一關,想透過這30天複習一下之前學校所學的內容,至於怎麼挑題完全是看自己的心情,那廢話不多說開始吧!
題目說明:給定一組字串,要你判斷此字串是否為有效的括號(成對且右括號對應到正確的左括號;例如"("要對應到")","{"要對應到"}")
Case 1
Input: s = "()"
Output: true。原因:有一左一右的括號
Case 2
Input: s = "()[]{}"
Output: true。原因:有三組括號都符合
Case 3
Input: s = "(]"
Output: false。原因:"("對應到的是")"
解題思路:括號匹配的問題,就是用到Stack進行處理,以下附上程式碼以及註解。
這邊順便複習一下Stack的特性以及功能:
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