20有效括号
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
map键值对
stack
注意sting虽然可以直接通过下标获取对应单字符,但是想要使用splice等数组函数必须先通过split函数转换为数组类型。
var isValid = function(s) {
//if(s.length%2===1)return false;//奇数一定失败
const stack=[];//栈
const map=new Map();
map.set('(',')');
map.set('[',']');
map.set('{','}');
for(let i=0;i<s.length;i++){
const c=s[i];
if(map.has(c)){//传入key({[
stack.push(c);
}else{
const t=stack[stack.length-1]//取栈顶
if(map.get(t)===c){
stack.pop();
}else return false
}
}
return stack.length===0
};
22 括号生产
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
括号与括号之间的关系有两种,在里面和并列
所以a、b也是合法序列的时候,一个合法的序列必然满足(a)b或者 a(b)
push() 是数组的一个方法,主要是将括号里的元素放到数组的后面。e.g:字符串,数组,null,undefined,object ,bealoon。都可以的。
push一个大括号,那意思就是希望往数组中追加一个object,同理push[]追加数组,后面可以通过下标定位给数组赋值。
var generateParenthesis = function(n) {
if (n === 0) return [];
//i对括号的组合可能存储在dp[i]
let dp = [
[""],
["()"]
]
for (let i=2;i<=n;i++) { // i表示要弄几对括号
// 括号里面和外面的括号对数
dp.push([]) ;//追加一个数组
for(let j=0;j<=i-1;j++) {//0至i-1,i-1至0
for (const k1 of dp[j]){//两个循环控制括号对数=j+i-j-1=i-1
for (const k2 of dp[i-j-1]) {
dp[i].push(k1 +"("+ k2+ ")" );
}
}
}
}
return dp [n]
};
32最长有效括号
给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
用栈实现滑动窗口法
var longestValidParentheses = function(s) {
let stack = [-1], ans = 0;
for (let i = 0; i < s.length; i++) {
if (s[i] === '(') {
stack.push(i)
} else {
stack.pop();
if (stack.length === 0) {///当前遍历的字符串中)多于(,需要从当前位置开始探索新的可能
stack.push(i);//栈底保存探索起点
} else {
ans = Math.max(ans, i - stack[stack.length - 1]);//栈顶保存最右的未被匹配的(括号
}
}
}
return ans;
};
678 有效的括号字符
给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:
任何左括号 ( 必须有相应的右括号 )。
任何右括号 ) 必须有相应的左括号 ( 。
左括号 ( 必须在对应的右括号之前 )。
- 可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。
一个空字符串也被视为有效字符串。
匹配问题的思想:双栈法,分别把(和*放入两个栈
var checkValidString = function(s) {
let stack_left=[],stack_star=[];
for(let i=0;i<s.length;i++){
if(s[i]=="("){
stack_left.push(i);
}
else if(s[i]=="*"){
stack_star.push(i);
}
else{
if(stack_left.length){
stack_left.pop();
}
else if(stack_star.length){
stack_star.pop();
}
else return false;
}
}
while(stack_left.length&&stack_star.length){//配对对位置有要求
if(stack_left.pop()>stack_star.pop()){
return false;
}
}
return !stack_left.length;
}
856 括号的分数
给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:
() 得 1 分。
AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。
(A) 得 2 * A 分,其中 A 是平衡括号字符串。
//我的思路是拆分 (()())=(())+(())
var scoreOfParentheses = function(S) {
let stack = [], grad = 0;
for (let i = 0; i < S.length; i++) {
if (S[i] === '(') {
stack.push(i);
} else {//遇到右括号开始算
grad+=Math.pow(2,stack.length-1);
while(S[++i] === ')') stack.pop();
}
}
return grad;
}