20.有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
1.栈
遍历给定的字符串s。当我们遇到一个左括号时,我们会期望在后续的遍历中,有一个相同类型的右括号将其闭合。由于
当我们遇到一个右括号时,我们需要将一个相同类型的左括号闭合。此时,我们可以取出栈顶的左括号并判断它们是否是相同类型的括号。如果不是相同的类型,或者栈中并没有左括号,那么字符串s无效,返回False。为了快速判断括号的类型,我们可以使用哈希表存储每一种括号。哈希表的键为右括号,值为相同类型的左括号。
在遍历结束后,如果栈中没有左括号,说明我们将字符串s中的所有左括号闭合,返回True,否则返回False。
注意到有效字符串的长度一定为偶数,如果字符串的长度为奇数,我们可以直接返回False,省去后续的遍历判断过程
1 var isValid = function(s){ 2 const n = s.length; 3 if( n % 2 === 1){ 4 return false; 5 } 6 const pairs = new Map([ 7 [')','('], 8 [']','['], 9 ['}','{'] 10 ]); 11 const stack = []; 12 for (let ch of s){ 13 if(pairs.has(ch)){ 14 if(!stack.length || stack[stack.length-1] !== pairs.get(ch)){ 15 return false; 16 } 17 stack.pop(); 18 } 19 else{ 20 stack.push(ch); 21 } 22 } 23 return !stack.length; 24 }
1 function isValid(s) { 2 let stack = []; 3 for (let i = 0; i < s.length; i++) { 4 if (s[i] === '(') { 5 stack.push(')'); 6 } else if (s[i] === '[') { 7 stack.push(']'); 8 } else if (s[i] === '{') { 9 stack.push('}'); 10 } else if (stack.length === 0 || s[i] !== stack.pop()) { 11 return false; 12 } else {} 13 } 14 return stack.length === 0; 15 }
时间复杂度:O(n),其中 n 是字符串 s 的长度。
空间复杂度:O(n+∣Σ∣),其中 Σ 表示字符集,本题中字符串只包含 6种括号,∣Σ∣=6。栈中的字符数量为 O(n),而哈希表使用的空间为O(∣Σ∣),相加即可得到总空间复杂度。
2.常规解法:switch语句
1 /** 2 * 3 * @param s string字符串 4 * @return bool布尔型 5 */ 6 function isValid( s ) { 7 // write code here 8 let stack = [], length = s.length; 9 if(length%2) return false; 10 for(let item of s){ 11 switch(item){ 12 case '(': 13 case '[': 14 case '{': 15 stack.push(item); 16 break; 17 case ')':if(stack.pop()!=='(') return false;break; 18 case ']':if(stack.pop()!=='[') return false;break; 19 case '}':if(stack.pop()!=='{') return false;break; 20 } 21 } 22 return !stack.length; 23 }; 24 module.exports = { 25 isValid : isValid 26 };

浙公网安备 33010602011771号