真桑分享的一道來自tsu暑期學(xué)校的題目:
給定一個只包含字符 “(“镰惦,”)” 的字符串,確定輸入字符串是否有效犬绒。
如果輸入字符串有效:
- 必須以正確的順序關(guān)閉和打開括號旺入。
- 請注意,空字符串也被視為有效凯力。
Example 1:
Input: "()"
Output: true
Example 2:
Input: "()()()"
Output: true
Example 3:
Input: "("
Output: false
Example 4:
Input: "(((()))"
Output: false
題目思路:核心在于配對的判斷R瘃!但又要加入限制條件咐鹤!
Version1:
最初的思路是定義一個int x=0拗秘,然后遇到一個"("就+1,遇到")"就-1祈惶,如果最后能==0雕旨,說明左右數(shù)量一樣,匹配完 成
但是捧请,如果遇到")("這種情況就要出問題了
所以多增加一個判斷:要求定義的x從頭到尾都>0凡涩,這樣就可以保證"("永遠(yuǎn)比")"多,提供了配對可能
代碼如下
public class Main {
public static void main(String[] args){
String s = ")(";
System.out.println(isValid(s));
}
public static boolean isValid(String s){
if(s == null || s.length() == 0){
return true;
}
int total = 0; //遇到"("則+1血久,")"則-1
for(int i=0;i<s.length();i++){
if(total < 0){
break;
}
if(s.charAt(i) == '('){
total++;
}else if(s.charAt(i) == ')'){
total--;
}
}
if(total == 0){
return true;
}else {
return false;
}
}
}
其實這個題真的不難突照,但是還搜到一種用Stack完成的方法,其實是這個Version2促使我寫了這篇簡書
- Version2:
使用Java中的Stack進(jìn)行匹配氧吐,只有Stack空掉了才是匹配成功嗷讹蘑!
(第一次用誒,所以紀(jì)念一下)
import java.util.Stack;
public class Main {
public static boolean isValid(String s){
if(s == null || s.length() ==0){
return true;
}
Stack<Character> stack = new Stack<Character>();//此處是“椫耍”的概念
for(int i=0;i<s.length();i++){
if(stack.empty()){//如果棧是空的時候座慰,直接把讀到的東西入棧
stack.push(s.charAt(i));//入棧的代碼
}else {
if(s.charAt(i) == ')' && stack.peek() == '('){//如果現(xiàn)在讀到的是‘)’并且頂上是‘(’
stack.pop();//彈出最頂上的‘(’
}else {
stack.push(s.charAt(i));//不滿足就都入棧
}
}
}//這里我把代碼換了一個位置可霎,之前那個看的有點別扭
return stack.empty();//如果棿钭郏空了晶丘,則說明匹配完成姥卢,返回true
}
public static void main(String[] args){
String s = "((()))";
System.out.println(isValid(s));
}
}