本題連接 leetcode-cn.com/problems/va…
這道題要用到棧這個數據結構去解題。有小括號,中括號和大括號三種括號,每種括號有左和右兩種形態,左右括號要匹配才合法。咱們的思路以下步驟:程序員
分析一下時間複雜度,每個元素都要入棧一次,因此時間複雜度是o(n)算法
思路理清楚了,咱們開始寫代碼:bash
var isValid = function(s){
let stack = [];
for(let item of s){
// 左括號正常入棧
if(item === '(') stack.push(')');
else if(item === '[') stack.push(']');
else if(item === '{') stack.push('}');
else { // 右括號
// 第一個字符就是右括號的狀況
if (stack.length === 0) return false ;
// 棧頂的左括號與右括號作匹配
if (stack.pop() !== item) return false;
}
}
// 最後棧裏的元素要爲空才返回true
return !stack.length;
}
複製代碼
最終順利經過,一樣的思路,咱們換一種寫法:數據結構
var isValid = function(s){
let stack = [];
let map = {
'(':')',
'[':']',
'{':'}'
};
for( let i=0; i<s.length; i++ ){
let cur = s[i];
if(map[stack[stack.length - 1]] === cur) stack.pop();;
else stack.push(cur);
}
return !stack.length;
}
複製代碼
第二種方法是社區大佬寫的,很是巧妙。用一個對象將配對的括號經過鍵值對存儲起來,讓代碼更簡潔,小弟現階段只能仰望。ui
作算法題必定要先把思路理順了再去寫,作這道題加寫這篇文章我整整花了兩個多小時,就是由於一拿到題就開始寫,沒有去分析,中間浪費了大量的時間在發呆、迷茫上面。leetcode真恐怖,這還只是簡單難度,兩天作一道leetcode可能要成爲一個flag了。作一個程序員真難🙂spa