JS關於字串的全排列演算法及記憶體溢位詳解
本文主要和大家分享JS關於字串的全排列演算法及記憶體溢位詳解,給定字串,求出所有由該字串內字元組合的全排列。所包含的字元不重複。
输入:"abc" 输出:["abc","acb","bac","bca","cab","cba"]
我在實作演算法時遇到了一個問題,至今無法解決。但是全排列演算法又很重要,所以寫這篇文章記錄一下。
演算法一:遞迴
演算法想法:
#當字串長度為1時,輸出該字串;
-
#當長度大於1時,取字串的首字母,求長度-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 < preResult.length; j++) { for (var k = 0; k < preResult[j].length + 1; k++) { //将首字母插入k位置 var temp = preResult[j].slice(0, k) + str[0] + preResult[j].slice(k); result.push(temp); } } return result; } }
演算法應該不難理解吧。但當傳參的字串是"abcdefghijkl"
時,排列用到的空間是12!=479001600
,過大的記憶體佔用導致記憶體溢出。如果你是在自己的PC上執行,那麼可以使用node --max-old-space-size=8192
來修改記憶體。但是我需要在Codewars上執行,所以無法修改記憶體。於是我想的辦法是利用尾遞歸優化。呵呵,Node的尾遞歸優化?不管了,先試試吧。
演算法二:尾遞歸
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 < result.length; i++) { let item = result[i]; let itemLen = item.length; for (let j = 0; j < itemLen+1; j++) { let temp = item.slice(0, j) + str[0] + item.slice(j); tempArr.push(temp); } } } //递归截取了第一个字符的子串 return permutate(str.slice(0),tempArr); } } permutate("abcdefghijkl",[]);
函數的第一個參數是本次遞歸的字串,第二個參數是前x個字元的全排列結果。
思路是:
每次取當次遞迴串的第一個字母;
若第二個參數長度為0說明是第一次遞歸,則初始化本次結果為
[首字母]
。然後將首字母從遞歸串中剔除,剩餘串傳給下一次遞歸;#之後每一次遞歸,都取遞歸串的首字母,將其插入前x個字符的全排列的所有位置,求出x+1個字元的全排列;
-
遞歸直到第一個參數為空串,則第二個參數為字串所有字符的全排列。
可能不太理解,不過知道這是尾遞歸就行了。雖然尾遞歸在ES6的嚴格模式中才有效,但是,我加上
'use strict';
後仍然無效。事實上我認為並不是函數呼叫棧的溢出,而是存放變數的堆溢出。所以,大概是無解了吧。畢竟全排列不管怎麼樣,空間複雜度都是O(n!)的。
演算法三:循環
最後再貼個循環的程式碼吧,也是沒什麼用,就當擴充思路了。
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 < result.length; i++) { let item = result[i]; let itemLen = item.length; for (let j = 0; j < itemLen+1; j++) { let temp = item.slice(0, j) + subStr[0] + item.slice(j); tempArr.push(temp); } } result = tempArr; tempArr = []; } subStr = subStr.slice(1); } return result; }
相關推薦:
#以上是JS關於字串的全排列演算法及記憶體溢位詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

對於機械硬碟、或SATA固態硬碟,軟體運轉速度的提升會有感覺,如果是NVME硬碟,可能感覺不到。一,註冊表導入桌面新建一個文字文檔,複製貼上如下內容,另存為1.reg,然後右鍵合併,並重新啟動電腦。 WindowsRegistryEditorVersion5.00[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\MemoryManagement]"DisablePagingExecutive"=d

本站9月3日消息,韓媒etnews當地時間昨報道稱,三星電子和SK海力士的「類HBM式」堆疊結構行動記憶體產品將在2026年後實現商業化。消息人士表示這兩大韓國記憶體巨頭將堆疊式行動記憶體視為未來重要收入來源,並計劃將「類HBM記憶體」擴展到智慧型手機、平板電腦和筆記型電腦中,為端側AI提供動力。綜合本站先前報導,三星電子的此類產品叫做LPWideI/O內存,SK海力士則將這方面技術稱為VFO。兩家企業使用了大致相同的技術路線,即將扇出封裝和垂直通道結合在一起。三星電子的LPWideI/O內存位寬達512

報告稱,三星電子的高層DaeWooKim表示,在2024年韓國微電子和封裝學會年會上,三星電子將完成採用16層混合鍵結HBM記憶體技術的驗證。據悉,這項技術已通過技術驗證。報告也稱,此次技術驗證將為未來若干年內的記憶體市場發展奠定基礎。 DaeWooKim表示,三星電子成功製造了基於混合鍵合技術的16層堆疊HBM3內存,該內存樣品工作正常,未來16層堆疊混合鍵合技術將用於HBM4內存量產。 ▲圖源TheElec,下同相較現有鍵合工藝,混合鍵結無需在DRAM記憶體層間添加凸塊,而是將上下兩層直接銅對銅連接,

本站5月6日消息,雷克沙Lexar推出Ares戰神之翼系列DDR57600CL36超頻內存,16GBx2套條5月7日0點開啟50元定金預售,至手價1299元。雷克沙戰神之翼記憶體採用海力士A-die記憶體顆粒,支援英特爾XMP3.0,提供以下兩個超頻預設:7600MT/s:CL36-46-46-961.4V8000MT/s:CL38-48-49 -1001.45V散熱方面,此內存套裝搭載1.8mm厚度的全鋁散熱馬甲,配備PMIC專屬導熱矽脂墊。記憶體採用8顆高亮LED燈珠,支援13種RGB燈光模式,可

根據TrendForce的調查報告顯示,AI浪潮對DRAM記憶體和NAND快閃記憶體市場帶來明顯影響。在本站5月7日消息中,TrendForce集邦諮詢在今日的最新研報中稱該機構調升本季兩類儲存產品的合約價格漲幅。具體而言,TrendForce原先預估2024年第二季DRAM記憶體合約上漲3~8%,現估計為13~18%;而在NAND快閃記憶體方面,原預估上漲13~18%,新預估為15 ~20%,僅eMMC/UFS漲幅較低,為10%。 ▲圖源TrendForce集邦諮詢TrendForce表示,該機構原預計在連續

本站6月7日消息,金邦(GEIL)在2024台北國際電腦展上推出了其最新DDR5解決方案,而且給出了SO-DIMM、CUDIMM、CSODIMM、CAMM2和LPCAMM2等版本可選。 ▲圖來源:Wccftech如圖所示,金邦展出的CAMM2/LPCAMM2記憶體採用非常緊湊的設計,最高可提供128GB的容量,速度最高可達8533MT/s,其中部分產品甚至可以在AMDAM5平台上穩定超頻至9000MT/s,且無需任何輔助散熱。據介紹,金邦2024款PolarisRGBDDR5系列記憶體最高可提供8400

1.先開啟pycharm,進入到pycharm首頁。 2.然後新建python腳本,右鍵--點選new--點選pythonfile。 3.輸入一段字串,代碼:s="-"。 4.接著需要把字串裡面的符號重複20次,代碼:s1=s*20。5、輸入列印輸出代碼,代碼:print(s1)。 6.最後運行腳本,在最底部會看到我們的回傳值:-就重複了20次。

PHP中int型別轉字串的方法詳解在PHP開發中,常會遇到將int型別轉換為字串型別的需求。這種轉換可以透過多種方式實現,本文將詳細介紹幾種常用的方法,並附帶具體的程式碼範例來幫助讀者更好地理解。一、使用PHP內建函數strval()PHP提供了一個內建函數strval(),可以將不同類型的變數轉換為字串類型。當我們需要將int型別轉換為字串型別時,
