[英]Leetcode Proble - 20. Valid Parentheses
我正在嘗試解決這個 leetcode 問題:給定一個僅包含字符 '('、')'、'{'、'}'、'[' 和 ']' 的字符串,確定輸入字符串是否有效。
輸入字符串在以下情況下有效:
開括號必須用相同類型的括號閉合。 開括號必須以正確的順序閉合。 請注意,空字符串也被認為是有效的。
我認為我幾乎是正確的,並且長期以來一直在解決這個問題,但無法獲得正確的輸出,尤其是在輸入為“())”的情況下。
類解決方案{
public boolean isValid(String s) {
Stack<Character> c = new Stack<>();
int n = s.length();
boolean bool = false;
if (s.isEmpty() | s == null) { // Correct
return true;
}
for (int i=0 ; i<n ; i++) {
if (s.charAt(i) == '{') {
c.push('{');
} else if (s.charAt(i) == '[') {
c.push('[');
} else if (s.charAt(i) == '(') {
c.push('(');
} else if (s.charAt(i) == '}' & c.peek() == '{') {
c.pop();
} else if (s.charAt(i) == ']' & c.peek() == '[') {
c.pop();
} else if (s.charAt(i) == ')' & c.peek() == '(') {
c.pop();
} else {
break;
}
}
if (c.isEmpty()) {
return true;
} else {
return false;
}
}
}
問題是您沒有將閉合括號添加到堆棧中,因此最后檢查堆棧大小會返回錯誤的結果。
您可以將缺少的方括號中的if更改為已經返回false,即
else if (s.charAt(i) == '}') {
if(c.peek() == '{'){
c.pop();
}
else{
return false;
}
}
其他將需要類似地進行更改。
我認為您應該在處理這些條件之前檢查堆棧的大小。
else if (s.charAt(i) == '}' & c.peek() == '{') {
c.pop();
} else if (s.charAt(i) == ']' & c.peek() == '[') {
c.pop();
} else if (s.charAt(i) == ')' & c.peek() == '(') {
c.pop();
}
謝謝大家的建議。 我發現我應該在使用peek()之前檢查堆棧是否為空。
else if (s.charAt(i) == '}') {
if (!c.isEmpty() && c.peek() == '{') {
c.pop();
}
else {
return false;
}
如果有人正在尋找 javascript 解決方案。
var isValid = function (s) {
// Stack to store left symbols
const leftSymbols = [];
// Loop for each character of the string
for (let i = 0; i < s.length; i++) {
// If left symbol is encountered
if (s[i] === '(' || s[i] === '{' || s[i] === '[') {
leftSymbols.push(s[i]);
}
// If right symbol is encountered
else if (s[i] === ')' && leftSymbols.length !== 0 && leftSymbols[leftSymbols.length - 1] === '(') {
leftSymbols.pop();
} else if (s[i] === '}' && leftSymbols.length !== 0 && leftSymbols[leftSymbols.length - 1] === '{') {
leftSymbols.pop();
} else if (s[i] === ']' && leftSymbols.length !== 0 && leftSymbols[leftSymbols.length - 1] === '[') {
leftSymbols.pop();
}
// If none of the valid symbols is encountered
else {
return false;
}
}
return leftSymbols.length === 0;
};
試試這個->
var isValid = function (s = "{[]}") {
const leftSymbols = [];
for (let i = 0; i < s.length; i++) {
if (s[i] === "(" || s[i] === "{" || s[i] === "[") {
leftSymbols.push(s[i]);
} else if (
s[i] === ")" &&
leftSymbols.length !== 0 &&
leftSymbols[leftSymbols.length - 1] === "("
) {
leftSymbols.pop();
} else if (
s[i] === "}" &&
leftSymbols.length !== 0 &&
leftSymbols[leftSymbols.length - 1] === "{"
) {
leftSymbols.pop();
} else if (
s[i] === "]" &&
leftSymbols.length !== 0 &&
leftSymbols[leftSymbols.length - 1] === "["
) {
leftSymbols.pop();
} else {
return false;
}
}
return leftSymbols.length === 0;
};
console.log(isValid());
如果有人正在尋找 java 解決方案:
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
for(int i=0; i<s.length(); i++){
char strChar = s.charAt(i);
if(stack.empty()){
stack.push(strChar);
} else{
char stkChar = (char) stack.peek();
if(stkChar == '(' && strChar ==')' ){
stack.pop();
} else if(stkChar == '{' && strChar=='}'){
stack.pop();
} else if(stkChar == '[' && strChar == ']'){
stack.pop();
} else{
stack.push(strChar);
}
}
}
return (stack.empty() ? "true" : "false");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.