題目:給定一個只包括 '(',')','{','}','[',']' 的字符串 s ,判斷字符串是否有效。有效字符串需滿足:
左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。
示例 1:
輸入:s = "()"
輸出:true
示例 2:
輸入:s = "()[]{}"
輸出:true
示例 3:
輸入:s = "(]"
輸出:false
示例 4:
輸入:s = "([)]"
輸出:false
示例 5:
輸入:s = "{[]}"
輸出:true
解題信息
如果咱們確實沒有刷過算法,不知道那么多套路,通過題目和示例盡可能的獲取到更多的信息就很重要了。
根據題目推斷出:
字符串s的長度一定是偶數,不可能是奇數(一對對匹配)。
右括號前面一定跟着左括號,才符合匹配條件,具備對稱性。
右括號前面如果不是左括號,一定不是有效的括號。
const isValid = (s) => {
while (true) {
let len = s.length
// 將字符串按照匹配對,挨個替換為''
s = s.replace('{}', '').replace('[]', '').replace('()', '')
// 有兩種情況s.length會等於len
// 1. s匹配完了,變成了空字符串
// 2. s無法繼續匹配,導致其長度和一開始的len一樣,比如({],一開始len是3,匹配完還是3,說明不用繼續匹配了,結果就是false
console.log(len+":gg---:"+s.length)
if (s.length === len) {
return len === 0
}
}
}
//執行結果例子
isValid('')
//0:gg---:0
//true
isValid('()')
//2:gg---:0
//0:gg---:0
//true
isValid('([{}])')
//6:gg---:0
//0:gg---:0
//true
isValid('([{')
//3:gg---:3
//false
isValid('([{})]')
//6:gg---:4
//4:gg---:4
//false
//這個語句直接放在瀏覽器執行有語法錯誤
while(true){
console.log('gg');
if(Math.random()>0.5){
return false
}
}
//測試案例,當判斷條件達成,返回false,結束while循環
function isValid(){
while(true){
console.log('gg');
if(Math.random()>0.5){
return true //這里return true ;return false; break; 都可以跳出循環(整個循環);continue不行,continue是跳出當前循環i繼續下次循環i+1;
}
}
}
//棧解題思路
const isValid = (s) => {
// 空字符串符合條件
if (!s) {
return true
}
const leftToRight = {
'(': ')',
'[': ']',
'{': '}'
}
const stack = []
for (let i = 0, len = s.length; i < len; i++) {
const ch = s[i]
// 左括號
if (leftToRight[ch]) {
stack.push(ch)
} else {
// 右括號開始匹配
// 1. 如果棧內沒有左括號,直接false
// 2. 有數據但是棧頂元素不是當前的右括號
if (!stack.length || leftToRight[ stack.pop() ] !== ch) {
return false
}
}
}
// 最后檢查棧內還有沒有元素,有說明還有未匹配則不符合
return !stack.length
}