LeetCode第六題

有效的括號

題目描述:

給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判斷字符串是否有效。
有效字符串需滿足:
左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。
注意空字符串可被認爲是有效字符串。

示例 1:
輸入: “()”
輸出: true

示例 2:
輸入: “()[]{}”
輸出: true

示例 3:
輸入: “(]”
輸出: false

示例 4:
輸入: “([)]”
輸出: false

示例 5:
輸入: “{[]}”
輸出: true

思路分析:
在看到這道題的時候,第一反應就是數據結構中的棧,在之前刷題的時候,也碰到不少類似的題目,使用棧可以完全解決此類問題。
首先再回顧一下棧的特點:先入後出(First In Last Out)FILO,與隊列的特點完全相反。也就是說先入棧的東西最後出棧,隊列則是先入先出 (First In First Out)FIFO,即先入隊列的東西先出隊列。

①首先判斷輸入的字符串的長度是否爲奇數或者偶數,如果是奇數,很簡單肯定不能完成括號的匹配,因爲括號是成對出現的。相反,如果字符串的長度是偶數,還需要進一步做判斷。
②如果字符串的長度是偶數,則需要讀字符串的字符逐個遍歷,首先開闢一個棧,在遍歷字符的時候,如果遇到左括號,將該字符壓棧,直到遍歷的字符爲右括號,當遇到右括號的時候,則需要出棧,從棧頂彈出一個字符去和當前字符做比較,如果兩個字符可以匹配成一個完成的括號,則繼續進行符號的遍歷,反覆如此這樣判斷。如果兩個符號無法完成一對括號的匹配,則說明整個字符串中的所有括號都無法完成匹配,則結束程序的運行即可。
③如果最後最終,棧中沒有剩餘元素,也就是沒有剩下左括號,說明剛好完成匹配,括號字符串有效。否則匹配失敗,括號字符串無效。

解題具體代碼如下:

在這裏插入代碼片

import java.util.Scanner;
import java.util.Stack;

public class Solution {

   public boolean isValid(String s) {
     boolean flag=false;
     if(s.length()==0)
       return true;
     if(s.length()%2!=0){
       return flag;
     }else{
       Stack<Character> stack=new Stack<>();
       for(int i=0;i<s.length();i++){
         char c=s.charAt(i);
         if(c=='('||c=='{'||c=='['||c=='"'){
           stack.push(c);
         }else{
           if(stack.isEmpty()){
             flag=false;
           }
           char popSymbol=stack.pop();
           if(popSymbol=='('&&c==')'||popSymbol=='{'&&c=='}'||popSymbol=='['&&c==']'||popSymbol=='"'&&c=='"'){
             flag=true;
           }
         }
       }
     }
     return flag;
      }

   public static void main(String[] args) {
    String symbolStr;
    Scanner sc=new Scanner(System.in);
    System.out.println("please input a string: ");
    symbolStr=sc.next();
    Solution su=new Solution();
    System.out.println(su.isValid(symbolStr));
  }
}
時間複雜度O(n)
空間複雜度O(n)

其實來說還有其他的方法,比如暴力,哈希,也都可以完成這道題。只不過暴力的時間複雜度更高。暫且就不用其他方法解題了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章