枚举数组的所有子数组

// 枚举,时间复杂度O(n^2),空间复杂度O(n)
// 枚举数组的所有子数组
// 外层循环控制起始位置,内层循环控制结束位置
function getAllSubarrays(arr) {
    let subarrays = []
    for (let i = 0; i < arr.length; i++) {
        for (let j = i; j < arr.length; j++) {
            subarrays.push(arr.slice(i, j + 1))
        }
    }
    return subarrays;
}

记忆化优化

// 此方法枚举数组中不重复的子字符串
// 将已枚举的数组存储起来,避免重复计算
function getAllSubarraysMemoization(arr) {
    let subarrays = []
    let memo = new Map()
 
    for (let i = 0; i < arr.length; i++) {
        for (let j = i; j < arr.length; j++) {
            let key = `${i}-${j}`;
            if (!memo.has(key)) {
                memo.set(key, arr.slice(i, j + 1))
            }
            subarrays.push(memo.get(key))
        }
    }
    return subarrays;
}

使用 Generator

// Generator函数优化
// 使用Generator函数生成子数组,避免一次性生成所有子数组
function* getAllSubarraysGenerator(arr) {
    for (let i = 0; i < arr.length; i++) {
        for (let j = i; j < arr.length; j++) {
            yield arr.slice(i, j + 1)
        }
    }
}
// 调用
const arr = [1, 2, 3]
for (let subarray of getAllSubarraysGenerator(arr)) {
    console.log(subarray)
}