最近チューリングで見た奇妙なプログラミング アルゴリズムの質問を共有する - ルールに準拠する括弧の複数のペアを生成する

トピック: 入力整数 Int n (1<n<8) を括弧の総数として、可能なすべての括弧の組み合わせの配列 string[] を出力します。

例 1

入力:n=1
出力:["()"]

例 2

入力:n=3
出力:["((()))", "(()())", "(())()", "()(())", "()()()"]

function handler(n) {
    
    
    let res;
    //	code here...

    return res;
}

この質問が変な理由は、以前見たプログラミング アルゴリズムの質問も括弧の並べ替えに関するものでしたが、その質問では "(()())))) ()" のように複数の括弧を含む文字列が提供されるためです
。すべての括弧を左右の括弧の正しいペアにするために追加する必要がある半括弧の数を計算します。
この種の括弧の並べ替えは、主に HTML エディターでの左タグと右タグの自動補完のために存在します。しかし、上記の質問の用途は思いつきません.ブロックをドラッグするときに可能な並べ替えを事前に計算するために使用されますか?
そして、この質問に 30 分を費やして、値を文字列に挿入することだけを考えましたが、それらを挿入するためにどのような規則を使用すればよいかわかりませんでした. テスト中、1 時間で 2 つのアルゴリズムの質問を完了したので、自動的に時間外に提出し、回答できませんでした。
これが私が別の日と夜を費やした解決策です(構文:javascript):

/*
第一种思路是打散字符串插值
将字符串A插入到长度为L的字符串B中所有字符的前后间隙位置中得到Array(L+1)个可能性结果,之后再将结果去重得到本次真正的结果。
之后根据输入值循环n次,得到最终结果。
其中字符串A="()",字符串B就是上一次得到的n-1结果数组[字符串B1,字符串B2],进行迭代得到的。
 */
function handler(n) {
    
    
    //  code here...
    let res = [""];
    //  获取所有插值可能性
    const single = (str = "", ins = "()") => {
    
    
        const strArr = [...str.split(""), ""];  //  数组最后一位添加任意项,确保前后空隙都会插入值
        return Array.from(new Set(strArr.map((noMatter, index) => {
    
    
            let _arr = Array.from(strArr);
            _arr.splice(index, 0, ins);
            return _arr.join("");
        })));
    };
    //  根据输入值执行n次插入
    while (n > 0) {
    
    
        res = res.reduce((prev, item) => Array.from(new Set([...prev, ...single(item)])), []);
        n--;
    }
    return res;
}

/*
第二种思路是先转换为数值单位进行叠加
是先将字符值"()"视为一个数值单位1,之后每次进行是间隙和自身都叠加值,第一次是[1],第二次是[[1,1],[2]],第三次是[[1,1,1],[2,1],[1,2],[3]],最后才根据单位数量叠加数量重新替换为字符值,例如2="(())",3="((()))"。
本质上这种方法没有脱离第一种思路,只是少了迭代过程中数组和字符串之间频繁来回转换的行为,只需要在首尾各进行一次转换即可,所以不再放具体代码,感兴趣的可以自行实现。
 */

完全なサンプル コード

次のコードをコピーしてローカル ファイルとして保存しfilename.js、コマンド ラインに入力して実行しnode filename.js、入出力テストを実行します。

//	@@filename.js
const readline = require("readline");
const insReadline = readline.createInterface({
    
    
    input: process.stdin,
    output: process.stdout
});

function showQuestion(question = "Please input the number of brackets you want, 0<number<8 \n", _handler = handler) {
    
    
    insReadline.question(question, input => {
    
    
        try {
    
    
            if (input >= 8 || input < 1) {
    
    
                throw new Error("input should be in [1,8].");
            }
            console.log("result:" + JSON.stringify(_handler(input)));
        } catch (err) {
    
    
            console.log(err);
        }
        console.log("End...");
        showQuestion();
    });
}

// 使用第一种思路:打散字符串插值
function handler(n) {
    
    
    //  code here...
    let res = [""];
    //  获取所有插值可能性
    const single = (str = "", ins = "()") => {
    
    
        const strArr = [...str.split(""), ""];  //  数组最后一位添加任意项,确保前后空隙都会插入值
        return Array.from(new Set(strArr.map((noMatter, index) => {
    
    
            let _arr = Array.from(strArr);
            _arr.splice(index, 0, ins);
            return _arr.join("");
        })));
    };
    //  根据输入值执行n次插入
    while (n > 0) {
    
    
        res = res.reduce((prev, item) => Array.from(new Set([...prev, ...single(item)])), []);
        n--;
    }
    return res;
}

//  don't touch
showQuestion();

上記は、このプログラミングアルゴリズムの問​​題の問題、問題解決のアイデア、およびコードの実装です. より良い解決策がある場合は、以下にコメントしてください~~

おすすめ

転載: blog.csdn.net/u013102711/article/details/128194351