この記事では主に、文字列に対する JS の完全な置換アルゴリズムと、文字列を指定して、文字列内のすべての文字の組み合わせの完全な置換を見つける方法について説明します。含まれる文字は繰り返されません。
输入:"abc" 输出:["abc","acb","bac","bca","cab","cba"]
アルゴリズムの実装時に問題が発生しましたが、まだ解決できません。しかし、全順列アルゴリズムは非常に重要なので、記録するためにこの記事を書きました。
アルゴリズム 1: 再帰的
アルゴリズムのアイデア:
文字列の長さが 1 の場合、文字列を出力します。
-
長さが 1 より大きい場合、文字列の最初の文字を取得し、 length -1 文字列のすべての順列。各順列の任意の位置に最初の文字を挿入します。
アルゴリズムの実装:
function permutate(str) { //保存每一轮递归的排列结果 var result = []; //初始条件:长度为1 if (str.length == 1) { return [str] } else { //求剩余子串的全排列,对每个排列进行遍历 var preResult = permutate(str.slice(1)); for (var j = 0; j <p> アルゴリズムを理解するのは難しくないはずです。ただし、パラメータ文字列が <code>"abcdefghijkl"</code> の場合、配置に使用される領域は <code>12!=479001600</code> となり、メモリを過剰に使用するとメモリ オーバーフローが発生します。自分の PC で実行している場合は、<code>node --max-old-space-size=8192</code> を使用してメモリを変更できます。ただし、Codewars 上で実行する必要があるため、メモリを変更することはできません。そこで私のアイデアは、末尾再帰最適化を使用することでした。ははは、Node の末尾再帰最適化ですか?何でもいいので、まずは試してみましょう。 <code>"abcdefghijkl"</code>时,排列用到的空间是<code>12!=479001600</code>,过大的内存占用导致内存溢出。如果你是在自己的PC上执行,那么可以使用<code>node --max-old-space-size=8192</code>来修改内存。但是我需要在Codewars上执行,所以无法修改内存。于是我想的办法是利用尾递归优化。呵呵,Node的尾递归优化?不管了,先试试吧。</p><h1 id="算法二-尾递归">算法二:尾递归</h1><pre class="brush:php;toolbar:false">function permutate(str,result) { 'use strict'; let tempArr = []; //终止条件str长度为0 if (str.length == 0) { return result } else { //第一次递归时,插入首字母 if(result.length === 0){ tempArr.push(str[0]); }else{ for (let i = 0; i <p>函数的第一个参数是本次递归的字符串,第二个参数是前x个字符的全排列结果。<br>思路是:</p><ol class=" list-paddingleft-2"> <li><p>每次取当次递归串的第一个字母;</p></li> <li><p>若第二个参数长度为0说明是第一次递归,则初始化本次结果为<code>[首字母]</code>。然后将首字母从递归串中剔除,剩余串传给下一次递归;</p></li> <li><p>之后每一次递归,都取递归串的首字母,将其插入前x个字符的全排列的所有位置,求出x+1个字符的全排列;</p></li> <li> <p>递归直到第一个参数为空串,则第二个参数为字符串所有字符的全排列。</p> <p>可能不太好理解,不过知道这是尾递归就行了。虽然尾递归在ES6的严格模式中才有效,但是,我加上<code>'use strict';</code></p>アルゴリズム 2: 末尾再帰</li> <pre class="brush:php;toolbar:false">function perm(str) { let result = [],tempArr = []; let subStr = str; while (subStr.length !== 0) { if (result.length === 0) { result.push(str[0]); } else { for (let i = 0; i関数の最初のパラメーターはこの再帰の文字列で、2 番目のパラメーターは最初の x 文字の完全な配置結果です。
アイデアは次のとおりです。現在の再帰文字列の最初の文字を毎回取得します。
の後の再帰ごとに、再帰文字列の最初の文字を取得し、それを最初の x 文字のすべての位置に挿入して検索します。 x+1 文字の完全な順列を取得します。
は、最初のパラメーターが空の文字列になるまで再帰的に実行され、その後、2 番目のパラメーターが文字列内のすべての文字の完全な順列になります。
理解するのは簡単ではないかもしれませんが、これが末尾再帰であることを知ってください。末尾再帰は ES6 の strict モードでのみ有効ですが、'use strict';
を追加した後でも機能しません。実際には、関数呼び出しスタックのオーバーフローではなく、変数を格納するヒープのオーバーフローだと思います。したがって、おそらく解決策はありません。結局のところ、完全な配置がどのようなものであっても、空間の複雑さは O(n!) です。 🎜🎜🎜🎜アルゴリズム 3: ループ🎜🎜 最後に、ループのコードを投稿します。これは役に立ちません。アイデアの拡張として使用してください。 🎜rrreee🎜関連する推奨事項: 🎜🎜🎜JS の完全な置換と組み合わせアルゴリズムの実装方法🎜🎜🎜🎜 JavaScript でのいくつかの再帰的な完全な置換アルゴリズムの例の詳細な説明🎜🎜🎜🎜JavaScript の興味深い質問: 完全な置換と重複排除🎜🎜以上がJSの文字列の完全配置アルゴリズムとメモリオーバーフローを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

去掉重复并排序的方法:1、使用“Array.from(new Set(arr))”或者“[…new Set(arr)]”语句,去掉数组中的重复元素,返回去重后的新数组;2、利用sort()对去重数组进行排序,语法“去重数组.sort()”。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于Symbol类型、隐藏属性及全局注册表的相关问题,包括了Symbol类型的描述、Symbol不会隐式转字符串等问题,下面一起来看一下,希望对大家有帮助。

怎么制作文字轮播与图片轮播?大家第一想到的是不是利用js,其实利用纯CSS也能实现文字轮播与图片轮播,下面来看看实现方法,希望对大家有所帮助!

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于对象的构造函数和new操作符,构造函数是所有对象的成员方法中,最早被调用的那个,下面一起来看一下吧,希望对大家有帮助。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下,希望对大家有帮助。

方法:1、利用“点击元素对象.unbind("click");”方法,该方法可以移除被选元素的事件处理程序;2、利用“点击元素对象.off("click");”方法,该方法可以移除通过on()方法添加的事件处理程序。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于BOM操作的相关问题,包括了window对象的常见事件、JavaScript执行机制等等相关内容,下面一起来看一下,希望对大家有帮助。

foreach不是es6的方法。foreach是es3中一个遍历数组的方法,可以调用数组的每个元素,并将元素传给回调函数进行处理,语法“array.forEach(function(当前元素,索引,数组){...})”;该方法不处理空数组。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

ドリームウィーバー CS6
ビジュアル Web 開発ツール

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター
