黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國(guó)咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁(yè) hot資訊 一文學(xué)會(huì)字符串全排列

一文學(xué)會(huì)字符串全排列

更新時(shí)間:2020-10-19 17:55:23 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1071次

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


我們?cè)诘谝淮斡鲆娮址帕羞@個(gè)問題的時(shí)候不要慌張,放輕松,然后冷靜思考,接下來(lái)我們來(lái)看下如何實(shí)現(xiàn)這道題。

首先我們來(lái)看下問題是什么。

給定一個(gè)字符串,求出這個(gè)字符串所有可能出現(xiàn)的排列組合。

如: abc

輸出:

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

準(zhǔn)備好了嗎? 來(lái)一起看下如何實(shí)現(xiàn)吧。

解答思路:

首先我們來(lái)做個(gè)假設(shè):

當(dāng)前給的字符串為 'a' 。那么返回的只有一個(gè)排列 [ 'a' ]。

當(dāng)前給的字符串為 'ab' 。則返回 [ 'ab', 'ba' ]。

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

………………


1. 一個(gè)字符的情況

乍一看好像沒什么規(guī)律,不急,我們先來(lái)實(shí)現(xiàn)以下只有一個(gè)字符的情況:

const str = 'a'

function fullPer (str) {

return [str]

}

fullPer(str) // [ 'a' ]

相信這個(gè)代碼大家都會(huì)寫。接下來(lái),難度繼續(xù)深入。


2. 兩個(gè)字符的情況

第二步,我們需要添加兩個(gè)字符的情況。兩個(gè)的情況下,為了便于我們理解,我們使用遞歸的方式實(shí)現(xiàn)。

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

何時(shí)結(jié)束:str 的長(zhǎng)度為 1 的時(shí)候

如何遞進(jìn):每次留一個(gè)字符,然后與剩下的字符相加

返回結(jié)果:返回一個(gè)數(shù)組

const str = 'ab'

function fullPer(str) {

if (str.length <= 1) {

return [str]

}

let result = [] // 定義一個(gè)結(jié)果集,用來(lái)收集所有的排列

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

let child = str[i] // 保留當(dāng)前字符

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

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

}

return result // 將得到的結(jié)果返回

}

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

解釋一下:

兩個(gè)字符的情況下,我們寫的代碼數(shù)量明顯比一個(gè)字符的情況多很懂,所以不好理解,那我們就來(lái)解釋一下代碼。

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

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

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


3. 三個(gè)字符的情況

三個(gè)字符與兩個(gè)字符相差不大,只不過我們需要變動(dòng)得到字符之后的處理。我們來(lái)看下代碼:

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)

// 因?yàn)檫@里得到的是一個(gè)數(shù)組,所以我們需要將result與middle做拼接

result = result.concat(middle)

}

return result

}

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

解釋一下:

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

結(jié)果集也不能使用push,得使用 concat 將兩個(gè)數(shù)組做拼接。


4. 三個(gè)字符以上的情況

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

// 四個(gè)字符

const str = 'abcd'

fullPer(str).length // 24

// 五個(gè)字符

const str = 'abcd3'

fullPer(str).length // 120


根據(jù)階乘公式可知,我們得到的是正確答案。我們直到解決完整個(gè)問題才發(fā)現(xiàn)其實(shí)問題本身并不復(fù)雜,而是我們?nèi)菀紫氲膹?fù)雜,反而影響了思路。相信看完了本文的小伙伴都能獨(dú)自完成字符串全排列的解答,也可以在本站的Java零基礎(chǔ)入門教程中學(xué)習(xí)新的解答方法,多給自己一點(diǎn)學(xué)習(xí)和進(jìn)步的空間!


提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 日本a级片网站 | 99久久免费国产特黄 | 手机日韩 | 久久天天躁狠狠躁夜夜2020一 | 欧美日韩a| 欧美精品xxxtv | 日韩精品a在线视频 | 亚洲欧美在线综合一区二区三区 | 2021国产精品自拍 | 国产国语对白一区二区三区 | 亚洲成av人片天堂网 | 一级毛片在线观看视频 | 2021国产精品午夜久久 | 欧美在线看片a免费观看 | 色聚网久久综合 | 亚洲第一福利网 | 日韩欧美中文字幕出 | 日韩欧美一区二区三区中文精品 | 在线色片 | a级成人毛片久久 | 亚州激情视频 | 精品久久伊人 | 久久精品久久精品国产大片 | 天天色综合天天 | 澳门一级毛片手机在线看 | 免费日韩一级片 | 999yy成年在线视频免费看 | 久久精品观看影院2828 | 婷婷在线五月 | 免费国产成人高清在线看软件 | 91夜夜| 老司机午夜免费 | 蜜桃日本一道无卡不码高清 | 国产精品一在线观看 | 亚洲国产日韩欧美综合久久 | 成人久久18免费网 | 免费精品视频在线 | 成人一级大片 | 精品国产一区二区三区不卡在线 | 草草国产成人免费视频 | 天天白天天谢天天啦 |