最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript如何返回字符串的所有排列

 更新時間:2023年01月17日 14:26:25   作者:黃元帥  
這篇文章主要介紹了javascript如何返回字符串的所有排列問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

js返回字符串的所有排列

需求

返回一個字符串所有的排列

  • 輸入:一個字符串
  • 輸出:一個包含該字符串所有排列情況的數組

代碼

const anagrams = str => {
  if (str.length <= 2) {
         return str.length === 2 ? [str, str[1] + str[0]] : [str];
  }
  else{
      return str.split('').reduce((acc, letter, i) =>
    acc.concat(anagrams(str.slice(0, i) + str.slice(i + 1)).map(val => letter + val)), []);
    }
};

效果

這里寫圖片描述

一點思路

遞歸、長度為階乘

js實現字符串全排序

這是一道經典的算法題,學過排列組合的童鞋們都知道長度為n的字符串其全排序大小為n! (這里不考慮字符串里有重復字符,不做去重處理)。

網上有各種語言的實現算法,但js語言實現的比較少(果然藐視【劃掉】忽略我廣大前端er的算法水平)。另外,網上實現的多為遞歸方法。這里用非遞歸的js實現一下,輕拍。

先說一下思路:單個字符的串,比如a全排序為1(廢話忽略)。

兩個字符的串比如ab,全排序數為2,即:ab和ba。那我們不禁要問,你是怎么得到的?

解答如下:

  • 第一步————先拿出a,那么a的前面和a的后面產生兩個空位,如圖:0 a 0。
  • 第二步————將b分別放在兩個空位里,得到ba和ab。
  • 第三步————sorry,沒有第三步。

好了,那三個字符abc你怎么辦?

其實還是老辦法,只不過我們是建立在剛才的2個字符組成的串已經全排完的基礎上。

  • 第一步————拿出剛才產生的ba,它產生了三個空位,如圖:0 b 0 a 0.
  • 第二步————把剩余的c分別插入這三個空位,得到cba,bca和bac。
  • 現在我們的ba已經被利用完了,還有ab沒用,ok,我們現在來用它重復上面的步驟,得到cab,acb和abc。

那四個字符abcd組成的串呢?

聰明的你一定想到用剛才三個字符產生的結果,每個串生成4個空位,然后把d分別放在這4個空位里。

至此,我們的算法思路就已經說完了?,F在開始用代碼實現。

function myPermutation(str){
        // 空字符串直接返回吧
	if(str.length === 0){
		console.log('The string you input have No length!');
		return;
	}
        // 一個字符也不用運算
	if(str.length === 1){
		console.log('The result array is: ' + str, '-&- The array length is: ' + str.length);
		return;
	}
        // 長度2以上的開始計算
        /* 先把字符串轉成數組,因為js里關于字符串的函數不多,而關于數組的函數很多,所以中間步驟我們都用數組處理,比較方便 */
 
	var arrayStr = str.split('');
        /* 定義一個中間數組,作為每次大循環(huán)的根基。比如,你開始拿第3個字符去填充空位,那前2個字符的全排列就已經都存儲在中間數組里了 */
        // 你開始拿第4個字符去填充空位,那前3個字符的全排列就已經都存儲在中間數組里了
 
	var transArray = [];
        /* 先把字符串的第1個字符存入中間數組,這是我們蓋高樓的地基。此字符產生的兩個空位,我們拿第2個字符開始去填充 */
	transArray.push(arrayStr[0]);
        // 定義一個存儲最終結果的數組,作為返回值
	var resultArray = [];
        /* 第一層循環(huán),從第2個字符開始,每次向字符串后取一個字符,往 中間數組 的每個字符串的 空位 里插 */
	for(var i = 1; i < arrayStr.length; i++){
		resultArray = [];
            // 每次新取到的字符
		var addChar = arrayStr[i];
            /* 第二層循環(huán),取一個 中間數組里 用以形成空位的 字符串,中間數組的長度就是此新字符前面的所有字符形成的全排列個數 */
		for(var j = 0; j < transArray.length; j++){
                // 依次取中間數組里的串
			var toBeInsertStr = transArray[j];
                // 用空格分割字符串,從而產生空位
			var toBeInsertStrArray = toBeInsertStr.split('');
                // 第三層循環(huán),將取到的新字符分別放到空位上形成字符串,有多少空位就循環(huán)幾次
			for (var k = 0; k <= transArray[j].length; k++){
				tempArray = toBeInsertStrArray.concat();
                // 用splice函數處理,表示將字符填入空位
				var insertedArray = toBeInsertStrArray.splice(k, 0, addChar);
                    // 剛才是數組操作,現在轉成字符串
				var transArrayItem = toBeInsertStrArray.join('');
                    // 將字符串壓入結果數組
				resultArray.push(transArrayItem);
				toBeInsertStrArray = tempArray.concat();
			}
		}
		transArray = [];
		transArray = resultArray.concat();
	}
	console.log('The result array is: ' + resultArray, '-&- The array length is: ' + resultArray.length);
}
 
myPermutation('');
myPermutation('a');
myPermutation('ab');
myPermutation('abc');

運行結果:

The string you input have No length!
The result array is: a -&- The array length is: 1
The result array is: ba,ab -&- The array length is: 2
The result array is: cba,bca,bac,cab,acb,abc -&- The array length is: 6

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • JavaScript編程的10+最佳實踐解決方案

    JavaScript編程的10+最佳實踐解決方案

    在現代Web開發(fā)中,JavaScript已經成為無法替代的核心技術,在現代Web開發(fā)中,JavaScript已經成為無法替代的核心技術,本文將通過代碼示例詳細介紹一些實踐解決方案,感興趣的同學可以參考下
    2023-06-06
  • JS中的Date()使用小結

    JS中的Date()使用小結

    Date() 日期對象是一個構造函數必須使用new來調用創(chuàng)建我們的日期對象,本文給大家介紹JS中的Date()使用小結,感興趣的朋友一起看看吧
    2024-01-01
  • 解讀new?Object()和Object.create()的區(qū)別

    解讀new?Object()和Object.create()的區(qū)別

    這篇文章主要介紹了解讀new?Object()和Object.create()的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 淺談JS繼承_借用構造函數 & 組合式繼承

    淺談JS繼承_借用構造函數 & 組合式繼承

    下面小編就為大家?guī)硪黄獪\談JS繼承_借用構造函數 & 組合式繼承。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • 原生JavaScript實現連連看游戲(附源碼)

    原生JavaScript實現連連看游戲(附源碼)

    原生JavaScript版連連看游戲,有源碼,適合初學者學習,喜歡的朋友可以研究下
    2013-11-11
  • JS中數組常用的循環(huán)遍歷你會幾種

    JS中數組常用的循環(huán)遍歷你會幾種

    JS 遍歷數組(循環(huán)數組)的方式有多種,但你都知道嗎?下面這篇文章主要給大家介紹了關于JS中數組常用循環(huán)遍歷的相關資料,需要的朋友可以參考下
    2021-06-06
  • js實現拖動緩動效果

    js實現拖動緩動效果

    這篇文章主要為大家詳細介紹了js實現拖動緩動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • 有關JavaScript的10個怪癖和秘密分享

    有關JavaScript的10個怪癖和秘密分享

    在本片文章中,作者將向您講述JavaScript中最鮮為人知的秘密。學習js的朋友可以參考下。
    2011-08-08
  • layer彈出層自適應高度,垂直水平居中的實現

    layer彈出層自適應高度,垂直水平居中的實現

    今天小編就為大家分享一篇layer彈出層自適應高度,垂直水平居中的實現,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • 鼠標經過tr時,改變tr當前背景顏色

    鼠標經過tr時,改變tr當前背景顏色

    本篇文章主要介紹了鼠標經過tr時,改變tr當前背景顏色的示例代碼,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01

最新評論

长海县| 惠水县| 全椒县| 庆安县| 务川| 饶平县| 姜堰市| 秀山| 长宁区| 邛崃市| 临西县| 梅河口市| 临漳县| 上林县| 玉林市| 楚雄市| 姚安县| 宣汉县| 南川市| 岳阳市| 宾阳县| 漯河市| 灌云县| 宁国市| 汝城县| 阜南县| 财经| 邵阳县| 新化县| 阳高县| 罗平县| 汝州市| 勃利县| 扎囊县| 乐安县| 丰城市| 望谟县| 曲阳县| 沾化县| 晴隆县| 康保县|