[英]Can someone explain what is wrong with my approach?
我試圖嘗試這個問題。 https://leetcode.com/problems/valid-parentheses/ 。 但是,如果在第二個 for 循環中我可以比較 s.charAt(i) 和 stack.pop(),我感到很困惑。
基本上,我的方法是這樣的。 將整個字符串壓入堆棧,然后使用 stack.charAt(i) 遍歷堆棧的前半部分,並使用 stack.pop() 將其與后半部分進行比較。 我只是想知道我的代碼可能出了什么問題,因為我在期望一個真值時得到一個假值。 我只是想了解我的概念是否有缺陷?
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
boolean done = false;
if(s.length() < 2)
return true;
for(int i = 0; i < s.length(); i++){
stack.push(s.charAt(i));
}
for(int i = 0; i < s.length()/2; i++){
if(s.charAt(i) == stack.pop())
done = true;
}
return done;
}
}
雖然您的代碼可能適用於“ {([])}
”和“ (())
”等字符串,但您假設這些字符串是對稱的。 諸如“ {()[]}
”之類的有效輸入不會傳入您的代碼,因為它不是對稱的。 修改您的代碼以解決不對稱問題。 提示:當字符是結束字符如“)”“}”和“]”時,可能會彈出 2 個元素。
您應該檢查字符串中的括號是否匹配:對於'('
有一個匹配')'
。 但是,請注意字符'('
不等於字符')'
。
您的代碼正在檢查字符串是否匹配字符串的后半部分是字符串前半部分的模式,例如{[))[{
。 換句話說,您正在檢查輸入是否為回文。
您應該采取的方法是僅將起始括號存儲在堆棧中:
for(int i = 0; i < s.length(); i++){
if s.charAt(i) is an open bracket:
stack.push(s.charAt(i));
else:
"pop" a character from stack
if it's '(' make sure that s.charAt(i) is ')'
if it's '[' make sure that s.charAt(i) is ']'
if it's '{' make sure that s.charAt(i) is '}'
}
您的代碼首先迭代到字符串的中間並填充堆棧,然后從中間迭代到末尾並彈出堆棧。 換句話說,您隱含地假設有效字符串的前半部分是各種類型的左括號,第二部分是它們對應的右括號(例如([])
或{[()]}
)。 然而,這些並不是唯一有效的字符串 - 沒有任何限制表明右括號后不能跟左括號,只要配對匹配 - 例如, (()())
是有效的細繩。
不要對字符串中的 position 進行假設,您應該遍歷字符串,對於每個字符,如果它是一個左括號,則將其推入堆棧,如果它是一個右括號,則彈出堆棧並比較兩者:
private static final Map<Character, Character> PARENS = new HashMap<>();
static {
PARENS.put('(', ')');
PARENS.put('[', ']');
PARENS.put('{', '}');
}
public static boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); ++i) {
char ch = s.charAt(i);
if (PARENS.containsKey(ch)) {
stack.push(ch);
} else {
if (stack.isEmpty()) {
return false;
}
char match = stack.pop();
if (ch != PARENS.get(match)) {
return false;
}
}
}
return stack.isEmpty();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.