20.給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判斷字符串是否有效。
有效字符串需滿足:
- 左括號必須用相同類型的右括號閉合。
- 左括號必須以正確的順序閉合。
注意空字符串可被認爲是有效字符串。
示例 1:
輸入: "()"
輸出: true
示例 2:
輸入: "()[]{}"
輸出: true
示例 3:
輸入: "(]"
輸出: false
示例 4:
輸入: "([)]"
輸出: false
示例 5:
輸入: "{[]}"
輸出: true
【思路】
和諾瓦科技的筆試題是一樣的,不過這裏複雜的是有三種類型的括號,所以首先需要定義一個哈希表把三種括號保存起來。然後將輸入的字符串從左到右判斷,當一個字符爲右括號的時候就是不合法的。當字符串爲左括號時則入棧,當爲右括號時需要看其是否能夠與左括號匹配起來,當都不滿足時返回false,最後根據棧是否爲空來判斷是否括號都能匹配上。
【運行代碼】
package leetcode_50;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Stack;
import javax.imageio.event.IIOReadWarningListener;
public class Leetcode_20 {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
boolean result;
result=isValid(s);
System.out.print(result);
}
private static boolean isValid(String s) {
Map<Character, Character> map=new HashMap<>();
map.put('(', ')');
map.put('{', '}');
map.put('[', ']');
char[] ch=s.toCharArray();
Stack<Character> stack=new Stack<>();
if(s.length()>0&&!map.containsKey(ch[0])) return false;
for(int i=0;i<s.length();i++){
if(stack.isEmpty()||map.containsKey(ch[i])){
stack.push(ch[i]);
//System.out.print(stack.peek()+"aaa");
}
else if(map.get(stack.peek())==ch[i])
stack.pop();
else
return false;
}
return stack.isEmpty();
}
}