大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 一文學會字符串全排列

一文學會字符串全排列

更新時間:2020-10-19 17:55:23 來源:動力節點 瀏覽1038次

求解字符串全排列一直是字符串相關問題中最常見的問題之一。雖然看起來很簡單,仍困擾著許許多多的Java初學者。本文我們就來給出字符串全排列的解答方案供大家參考。


我們在第一次遇見字符串全排列這個問題的時候不要慌張,放輕松,然后冷靜思考,接下來我們來看下如何實現這道題。

首先我們來看下問題是什么。

給定一個字符串,求出這個字符串所有可能出現的排列組合。

如: abc

輸出:

[ 'cba', 'bca', 'cab', 'acb', 'bac', 'abc' ]

準備好了嗎? 來一起看下如何實現吧。

解答思路:

首先我們來做個假設:

當前給的字符串為 'a' 。那么返回的只有一個排列 [ 'a' ]。

當前給的字符串為 'ab' 。則返回 [ 'ab', 'ba' ]。

當前給的字符串為 'abc' 。則返回 [ 'cba', 'bca', 'cab', 'acb', 'bac', 'abc' ]。

………………


1. 一個字符的情況

乍一看好像沒什么規律,不急,我們先來實現以下只有一個字符的情況:

const str = 'a'

function fullPer (str) {

return [str]

}

fullPer(str) // [ 'a' ]

相信這個代碼大家都會寫。接下來,難度繼續深入。


2. 兩個字符的情況

第二步,我們需要添加兩個字符的情況。兩個的情況下,為了便于我們理解,我們使用遞歸的方式實現。

使用遞歸我們需要先找到以下幾個條件

何時結束:str 的長度為 1 的時候

如何遞進:每次留一個字符,然后與剩下的字符相加

返回結果:返回一個數組

const str = 'ab'

function fullPer(str) {

if (str.length <= 1) {

return [str]

}

let result = [] // 定義一個結果集,用來收集所有的排列

for(let i = 0,len = str.length;i < len; i ++) {

let child = str[i] // 保留當前字符

let last = str.replace(child, '') // 獲得剩下的所有字符

result.push(fullPer(last)[0] + child) // 將得到的下一個字符與當前字符做拼接

}

return result // 將得到的結果返回

}

fullPer(str) // [ 'ba', 'ab' ]

解釋一下:

兩個字符的情況下,我們寫的代碼數量明顯比一個字符的情況多很懂,所以不好理解,那我們就來解釋一下代碼。

代碼中,如果我們當前保留的字符是 a 的話,那么下一次傳入的就是 b 。然后字符長度為1,不做處理,直接返回一個數組。之后我們將得到的字符b與保留字符a相加,得到 ba

同樣的道理,保留字符為 b ,下次傳入 a,得到 ab

將兩次的結果分別添加到結果集中,返回得到 [ 'ba', 'ab' ]


3. 三個字符的情況

三個字符與兩個字符相差不大,只不過我們需要變動得到字符之后的處理。我們來看下代碼:

const str = 'abc'

function fullPer(str) {

if (str.length <= 1) {

return [str]

}

let result = []

for(let i = 0,len = str.length;i < len; i ++) {

let child = str[i]

let last = str.replace(child, '')

// 唯一與第二步不一樣的地方

const middle = fullPer(last).map(item => item + child)

// 因為這里得到的是一個數組,所以我們需要將result與middle做拼接

result = result.concat(middle)

}

return result

}

fullPer(str) // [ 'cba', 'bca', 'cab', 'acb', 'bac', 'abc' ]

解釋一下:

三個字符的情況,我們得到的是一個多元素的數組,所以只能通過遍歷的方式都添加上之前所保留的字符child

結果集也不能使用push,得使用 concat 將兩個數組做拼接。


4. 三個字符以上的情況

我們先驗證一下其他數量字符的情況下,上邊的函數能不能用,這里我們就輸出結果的總數,不輸出具體值了。

// 四個字符

const str = 'abcd'

fullPer(str).length // 24

// 五個字符

const str = 'abcd3'

fullPer(str).length // 120


根據階乘公式可知,我們得到的是正確答案。我們直到解決完整個問題才發現其實問題本身并不復雜,而是我們容易想的復雜,反而影響了思路。相信看完了本文的小伙伴都能獨自完成字符串全排列的解答,也可以在本站的Java零基礎入門教程中學習新的解答方法,多給自己一點學習和進步的空間!


提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 久久精品国产线看观看亚洲 | 九九在线观看精品视频6 | 视频在线一区二区三区 | 擼擼色在线看观看免费 | 国产色婷婷精品免费视频 | 热99这里有精品综合久久 | 色多多h| 亚洲天天做夜夜做天天欢人人 | 日韩精品免费一区二区三区 | 精品国产91久久久久久久a | 天天操国产 | 四虎影视884a精品国产古代 | 国产乱码亚洲精品一区二区 | 这里只有精品国产 | 自拍偷自拍亚洲精品被多人伦好爽 | 欧美日韩一区二区高清视 | 久久99九九精品免费 | 99免费在线观看视频 | 日韩色综合 | 欧美精品九九99久久在观看 | 日日摸夜夜添夜夜添欧美毛片 | 亚洲欧美精品网站在线观看 | 精品一区二区久久久久久久网精 | 午夜视频国产 | 777kkk亚洲综合欧美色老头 | 在线欧美精品国产综合五月 | 日韩在线国产 | 五月婷婷基地 | 久久精品免视着国产成人 | 51精品视频在线一区二区 | 添bbb免费观看高清视频 | 久久成人免费观看全部免费 | a一级网站 | 国产精品一区视频 | 久久www免费人成_看片高清 | 香蕉欧美 | 精品国产亚一区二区三区 | 精品哟啊呦v视频在线观看 精品哟哟国产在线观看 | 97久久精品人人做人人爽 | 国产大战女模特在线视频 | 看毛片网 |