let st = [], res = [] // 全局变量
// 1、组合 (无序)
function tract(arr, k, start = 0) {
let len = arr.length
if(st.length === k) {
res.push([...st])
return
}
for(let i = start; i < len; i++) {
st.push(arr[i])
tract(arr,k,i+1)
st.pop()
}
return res
}
// 2、排列 (有序)
let used = []
function combine(arr, len) {
if(len === st.length) {
res.push([...st])
return
}
for(let i=0; i<arr.length; i++) {
if(!used[i]) {
used[i] = true
st.push(arr[i])
combine(arr, len)
st.pop()
used[i] = false
}
}
return res
}
// 根据入栈顺序检查出栈的顺序是否正确
/*
** @params: ins:入栈顺序, outs:出栈顺序
** @return:布尔值
*/
function check(ins, outs) {
let st= [], j = 0
for(let i=0; i<ins.length; i++) {
st.push(ins[i])
while(st.length !== 0) {
if(st[st.length-1] === outs[j]) {
// 如果st栈顶元素是和outs出栈元素相同就出栈
st.pop()
j++
} else {
// 如果不同继续入栈st
break
}
}
}
return st.length === 0
}
// *** test ***
// console.log(combine([1, 2, 3], 3))
// console.log(tract(['a', 'b', 'c'], 3))
console.log(check([1,2,3], [3,1,2]))
console