有效的括號
題目描述:
給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判斷字符串是否有效。
有效字符串需滿足:
左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。
注意空字符串可被認爲是有效字符串。
示例 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)
其實來說還有其他的方法,比如暴力,哈希,也都可以完成這道題。只不過暴力的時間複雜度更高。暫且就不用其他方法解題了。