【LittleDuck_LeetCodeNote】20 - Valid Parentheses

閱讀時間約 10 分鐘

A realistic, brightly colored interior home-style drawing in blue tones of a software engineer. - Leonardo.ai

Question and Hints

Given a string s containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid.
An input string is valid if:
  1. Open brackets must be closed by the same type of brackets.
  2. Open brackets must be closed in the correct order.
  3. Every close bracket has a corresponding open bracket of the same type.
Example 1:
Input: s = "()"
Output: true
Example 2:
Input: s = "()[]{}"
Output: true
Example 3:
Input: s = "(]"
Output: false
Constraints:
  • 1 <= s.length <= 104
  • s consists of parentheses only '()[]{}'.

First Solution

💡 相當經典的Stack考題,因為括號一定是成雙成對,而且不能穿插,
所以假如右括號的前一個字元不是對應的左括號,就是有問題的。
成對的括號就全部pop掉,理想情況下最後Stack會pop掉全部的括號,
這時就可以回傳true,除此之外的異常都要回傳false。

注意:第一個字元如果就是右括號,那就直接回傳false,
因為這一開始就有問題。
class Solution {
public boolean isValid(String s) {
Stack<Character> stk = new Stack<>();

for(int i=0; i<s.length(); i++){
  // avoid first Parentheses is valid rightnow.
if(stk.empty()){
if(s.charAt(i) == ')' || s.charAt(i) == ']' || s.charAt(i) == '}')
return false;
}

stk.push(s.charAt(i));
switch(s.charAt(i)){
case ')':
stk.pop();
if(!(stk.pop().equals('(')))
return false;
break;

case ']':
stk.pop();
if(!(stk.pop().equals('[')))
return false;
break;

case '}':
stk.pop();
if(!(stk.pop().equals('{')))
return false;
break;
}
}
if(stk.empty())
return true;

return false;
}
}
⏰ Runtime: 2 ms (86.51 %)
📦 Memory: 40.4 MB (83.13 %)

Upgrade Solution

more clear and faster.
💡 邏輯是一樣的,只是這寫法更乾淨也更快:
  • 可以直接用 toCharArray() 將字串轉成陣列,用Enhance for loop ( for-each, 又稱加強版for迴圈 )去做檢查。
  • 左括號也進行判斷再push,可以少一點多餘的檢查。
  • 右括號push進去前先檢查peek,可以少一次pop和push。
  • 最後 Stack.empty()本身就會回傳true或false,所以不用多此一舉加上if,直接回傳Stack.empty() 就好。
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
if (c == '(' || c == '{' || c == '[') {
stack.push(c);
} else {
if (stack.empty()) {
return false;
}
if (c == ')' && stack.peek() == '(') {
stack.pop();
} else if (c == '}' && stack.peek() == '{') {
stack.pop();
} else if (c == ']' && stack.peek() == '[') {
stack.pop();
} else {
return false;
}
}
}
return stack.empty();
}
}
⏰ Runtime: 1 ms (%)
📦 Memory: 40.9 MB (25.79 %)

Bonus Solution:

the fastest, no stack.
💡 一樣的邏輯,只是這個寫法是不使用Java內建的Stack,
而是用陣列結合index的操作去時做出Stack的效果,
雖然閱讀起來不太直觀,但就速度上來說是最快的。
class Solution {
public boolean isValid(String s) {
char[] word = new char[s.length()];
int wordIdx = -1;
for (char ch : s.toCharArray()) {
if (ch == '(' || ch == '{' || ch == '[') {
word[++wordIdx] = ch;
} else {
if (wordIdx < 0) {
return false;
}
char ch2 = word[wordIdx--];
if ( ch == ')' && ch2 != '(' ||
ch == '}' && ch2 != '{' ||
ch == ']' && ch2 != '[') {
return false;
}
}
}
return wordIdx < 0;
}
}
⏰ Runtime: 0 ms (100 %)
📦 Memory: 40.1 MB (96.48 %)
為什麼會看到廣告
avatar-img
6會員
36內容數
以英文和日文歌的翻譯為主,並從「歌曲裡的故事」這個角度去翻譯。畢竟自己只有中文算好而已 :D
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Steven SHIH的沙龍 的其他內容
Longest Common Prefix : 回傳陣列中所有字串的最長共同前序(LCP),也就是從最前面開始依序算起,所有字串都擁有的字元。
Roman to Integer : 將羅馬數字轉換成阿拉伯數字。
Palindrome Number : 判斷x是否為迴文 ( 左到右,右到左,內容皆相同 ) ,若符合回傳true,不符合則回傳false。
Two Sum : 在Array中找出相加後與Target相同的兩個數字,並將他們的index存在新的陣列。
Longest Common Prefix : 回傳陣列中所有字串的最長共同前序(LCP),也就是從最前面開始依序算起,所有字串都擁有的字元。
Roman to Integer : 將羅馬數字轉換成阿拉伯數字。
Palindrome Number : 判斷x是否為迴文 ( 左到右,右到左,內容皆相同 ) ,若符合回傳true,不符合則回傳false。
Two Sum : 在Array中找出相加後與Target相同的兩個數字,並將他們的index存在新的陣列。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
題目 Given two integer arrays pushed and popped each with distinct values, return true if this could have been the result of a sequence of push and pop
Thumbnail
在Laravel中除了用Validator來驗證資料,還可以用Form Request Validation,建立一個驗證class,在request進入controller之前,會先在這邊做驗證,若驗證失敗則不會繼續執行Controller。 建立form request: 範例程式碼:
As virtuous men pass mildy away. And whisper to their souls to go, Whilst some of their sad friends fo say So let us melt,and make noe noise,
Thumbnail
The eternal validity of the soul: 靈魂永生,我倒覺得也可以翻作靈魂的永恆存在 The nature of personal reality: 個人實相的本質,或作個人實相的自然 The “unknown” reality: 未知的實相 這三本書是賽斯說的,藉由Ja
Thumbnail
前幾天看別人直播刷題,心血來潮打開很久沒動的leetcode試試,挑了一題當初面試沒寫出來的題目。嗯...我那時才剛碰資料結構,知道要用stack寫卻沒實作過任何東西,現在有工作經驗後再來寫,看看會不會有不一樣的想法。
Thumbnail
他們擅長在曲目中拼湊多種聲效,運用極具音樂技巧的節拍游刃切換,在音樂中營造一種和諧的 “破碎感” 。這一次的《Mood Valiant》,Hiatus Kaiyote 更是在往內探索的同時,揉合更多的音樂語言,用更完整的形式表現了一張專輯的可能樣貌。
紀錄一下Laravel好用的validator。 E 本筆記參考: 1. https://stackoverflow.com/questions/31539727/laravel-password-validation-rule
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
題目 Given two integer arrays pushed and popped each with distinct values, return true if this could have been the result of a sequence of push and pop
Thumbnail
在Laravel中除了用Validator來驗證資料,還可以用Form Request Validation,建立一個驗證class,在request進入controller之前,會先在這邊做驗證,若驗證失敗則不會繼續執行Controller。 建立form request: 範例程式碼:
As virtuous men pass mildy away. And whisper to their souls to go, Whilst some of their sad friends fo say So let us melt,and make noe noise,
Thumbnail
The eternal validity of the soul: 靈魂永生,我倒覺得也可以翻作靈魂的永恆存在 The nature of personal reality: 個人實相的本質,或作個人實相的自然 The “unknown” reality: 未知的實相 這三本書是賽斯說的,藉由Ja
Thumbnail
前幾天看別人直播刷題,心血來潮打開很久沒動的leetcode試試,挑了一題當初面試沒寫出來的題目。嗯...我那時才剛碰資料結構,知道要用stack寫卻沒實作過任何東西,現在有工作經驗後再來寫,看看會不會有不一樣的想法。
Thumbnail
他們擅長在曲目中拼湊多種聲效,運用極具音樂技巧的節拍游刃切換,在音樂中營造一種和諧的 “破碎感” 。這一次的《Mood Valiant》,Hiatus Kaiyote 更是在往內探索的同時,揉合更多的音樂語言,用更完整的形式表現了一張專輯的可能樣貌。
紀錄一下Laravel好用的validator。 E 本筆記參考: 1. https://stackoverflow.com/questions/31539727/laravel-password-validation-rule