精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一篇學會字符串的排列

開發 前端
排列方案的生成:根據字符串排列的特點,考慮深度優先搜索所有排列方案。即通過字符交換,先固定第1位字符( n種情況)、再固定第2位字符(n-1種情況)、...、最后固定第n位字符(1種情況)。

[[439357]]

本文轉載自微信公眾號「程序員千羽」,作者程序員千羽。轉載本文請聯系程序員千羽公眾號。

 Leetcode : https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/

“GitHub : https://github.com/nateshao/leetcode/blob/main/algo-notes/src/main/java/com/nateshao/sword_offer/topic_30_permutation/Solution.java

字符串的排列

“題目描述 :輸入一個字符串,打印出該字符串中字符的所有排列。你可以以任意順序返回這個字符串數組,但里面不能有重復元素。為了讓您更好地理解問題,以下面的二叉搜索樹為例:難度:中等示例:

  1. 輸入:s = "abc" 
  2.  
  3. 輸出:["abc","acb","bac","bca","cab","cba"

解題思路:

對于一個長度為 n 的字符串(假設字符互不重復),其排列方案數共有:

排列方案的生成:根據字符串排列的特點,考慮深度優先搜索所有排列方案。即通過字符交換,先固定第1位字符( n種情況)、再固定第2位字符(n-1種情況)、...、最后固定第n位字符(1種情況)。

重復排列方案與剪枝:當字符串存在重復字符時,排列方案中也存在重復的排列方案。為排除重復方案,需在固定某位字符時,保證“每種字符只在此位固定一次” ,即遇到重復字符時不交換,直接跳過。從DFS角度看,此操作稱為"剪枝” 。

遞歸解析:

  • 終止條件: 當 x = len(c) - 1 時,代表所有位已固定(最后一位只有 11 種情況),則將當前組合 c 轉化為字符串并加入 res ,并返回;
  • 遞推參數: 當前固定位 x ;
  • 遞推工作: 初始化一個 Set ,用于排除重復的字符;將第 x 位字符與 i ∈ [x, len(c)] 字符分別交換,并進入下層遞歸;
    • 剪枝: 若 c[i] 在 Set 中,代表其是重復字符,因此 “剪枝” ;
    • 將 c[i] 加入 Set ,以便之后遇到重復字符時剪枝;
    • 固定字符: 將字符 c[i] 和 c[x] 交換,即固定 c[i] 為當前位字符;
    • 開啟下層遞歸: 調用 dfs(x + 1) ,即開始固定第 x + 1 個字符;
    • 還原交換: 將字符 c[i] 和 c[x] 交換(還原之前的交換);

下圖中 list 對應文中的列表 c 。比如

舉個例子:

  1. 通過交換來固定某個位置的元素這個思路, 
  2. 就 abc 這個字符串來說,第一個位置可以放 a 或者 b 或者 c,但是如果確定要放某個字符, 
  3. 比如第一個位置放 a,那么第二個位置就只能放 b 或者 c; 
  4. 如果第一個位置放 b,那么第二個位置就只能放 a 或者 c; 
  5. 如果第一個位置放 c,那么第二個位置就只能放 a 或者 b; 
  6. 當把某個字符移動到第一位以后,暫時第一位的字符就固定住了, 
  7. 這時再去確定第二個位置的元素,并且此時第一個位置的元素不會再出現在后面的位置上, 
  8. 依次類推直到確定所有位置的元素,再往前回溯確定每個位置上其他可能出現的元素。 

復雜度分析:

  • 時間復雜度0(N!N) :N為字符串s的長度;時間復雜度和字符串排列的方案數成線性關系,案數為N x(N- 1)x (N- 2)...x2x1,即復雜度為0(N!) ;

字符串拼接操作join() 使用O(N)因此總體時間復雜度為O(N!N)。

  • 空間復雜度0(N2) :全排列的遞歸深度為N,系統累計使用棧空間大小為0(N) ;

遞歸中輔助Set累計存儲的字符數量最多為N +(N- 1)+...+2+1=(N + 1)N/2 ,即占用O(N2)的額外空間。

  1. package com.nateshao.sword_offer.topic_30_permutation; 
  2.  
  3. import java.util.ArrayList; 
  4. import java.util.Collections; 
  5. import java.util.HashSet; 
  6. import java.util.List; 
  7.  
  8. /** 
  9.  * @date Created by 邵桐杰 on 2021/12/2 15:31 
  10.  * @微信公眾號 程序員千羽 
  11.  * @個人網站 www.nateshao.cn 
  12.  * @博客 https://nateshao.gitee.io 
  13.  * @GitHub https://github.com/nateshao 
  14.  * @Gitee https://gitee.com/nateshao 
  15.  * Description: 劍指 Offer 38. 字符串的排列 
  16.  */ 
  17. public class Solution { 
  18.  
  19.     public static void main(String[] args) { 
  20.         String str = "abc"
  21.         ArrayList<String> list = permutation2(str); 
  22.         list.stream().forEach(lists-> System.out.print( lists+" " )); // abc acb bac bca cab cba 
  23.         System.out.println(); 
  24.         for (String s : list) { 
  25.             System.out.print(s + " "); // abc acb bac bca cab cba 
  26.         } 
  27.     } 
  28.      
  29.     /** 
  30.      * 劍指offer 
  31.      * 解題思路:將當前位置的字符和前一個字符位置交換,遞歸. 
  32.      * @param str 
  33.      * @return 
  34.      */ 
  35.     public static ArrayList<String> permutation2(String str) { 
  36.         ArrayList<String> res = new ArrayList<>(); 
  37.         if (str == nullreturn res; 
  38.         helper(res, 0, str.toCharArray()); 
  39.         // 符合結果的輸出順序 
  40.         Collections.sort(res); 
  41.         return res; 
  42.  
  43.     } 
  44.  
  45.     private static void helper(ArrayList<String> res, int indexchar[] s) { 
  46.         if (index == s.length - 1) { 
  47.             res.add(String.valueOf(s)); 
  48.             return
  49.         } 
  50.         for (int i = index; i < s.length; i++) { 
  51.             if (i == index || s[index] != s[i]) { 
  52.                 swap(s, index, i); 
  53.                 helper(res, index + 1, s); 
  54.                 swap(s, index, i); 
  55.             } 
  56.         } 
  57.     } 
  58.      
  59.     public static void swap(char[] c, int a, int b) { 
  60.         char temp = c[a]; 
  61.         c[a] = c[b]; 
  62.         c[b] = temp
  63.     } 
  64.     /********************** 精選解答 **************************/ 
  65.     //為了讓遞歸函數添加結果方便,定義到函數之外,這樣無需帶到遞歸函數的參數列表中 
  66.     List<String> list = new ArrayList<>(); 
  67.     //同;但是其賦值依賴c,定義聲明分開 
  68.     char[] c; 
  69.     public String[] permutation(String s) { 
  70.         c = s.toCharArray(); 
  71.         //從第一層開始遞歸 
  72.         dfs(0); 
  73.         //將字符串數組ArrayList轉化為String類型數組 
  74.         return list.toArray(new String[list.size()]); 
  75.     } 
  76.  
  77.     public void dfs(int x) { 
  78.         //當遞歸函數到達第三層,就返回,因為此時第二第三個位置已經發生了交換 
  79.         if (x == c.length - 1) { 
  80.             //將字符數組轉換為字符串 
  81.             list.add(String.valueOf(c)); 
  82.             return
  83.         } 
  84.         //為了防止同一層遞歸出現重復元素 
  85.         HashSet<Characterset = new HashSet<>(); 
  86.         //這里就很巧妙了,第一層可以是a,b,c那么就有三種情況,這里i = x,正巧dfs(0),正好i = 0開始 
  87.         // 當第二層只有兩種情況,dfs(1)i = 1開始 
  88.         for (int i = x; i < c.length; i++){ 
  89.             //發生剪枝,當包含這個元素的時候,直接跳過 
  90.             if (set.contains(c[i])){ 
  91.                 continue
  92.             } 
  93.             set.add(c[i]); 
  94.             //交換元素,這里很是巧妙,當在第二層dfs(1),x = 1,那么i = 1或者 2, 不是交換1和1,要就是交換1和2 
  95.             swap(i,x); 
  96.             //進入下一層遞歸 
  97.             dfs(x + 1); 
  98.             //返回時交換回來,這樣保證到達第1層的時候,一直都是abc。這里捋順一下,開始一直都是abc,那么第一位置總共就3個交換 
  99.             //分別是a與a交換,這個就相當于 x = 0, i = 0; 
  100.             //     a與b交換            x = 0, i = 1; 
  101.             //     a與c交換            x = 0, i = 2; 
  102.             //就相當于上圖中開始的三條路徑 
  103.             //第一個元素固定后,每個引出兩條路徑, 
  104.             //     b與b交換            x = 1, i = 1; 
  105.             //     b與c交換            x = 1, i = 2; 
  106.             //所以,結合上圖,在每條路徑上標注上i的值,就會非常容易好理解了 
  107.             swap(i,x); 
  108.         } 
  109.     } 
  110.     private void swap(int i, int x) { 
  111.         char temp = c[i]; 
  112.         c[i] = c[x]; 
  113.         c[x] = temp
  114.     } 

參考文章:https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/solution/mian-shi-ti-38-zi-fu-chuan-de-pai-lie-hui-su-fa-by

 

責任編輯:武曉燕 來源: 程序員千羽
相關推薦

2021-11-29 08:49:37

字符串轉換整數

2023-03-07 10:07:04

JavaScript字符串反斜杠

2022-01-02 08:43:46

Python

2022-02-07 11:01:23

ZooKeeper

2021-11-15 07:47:40

字符串位置存儲

2021-05-28 10:02:05

Swift5 字符串String

2022-06-30 22:53:18

數據結構算法

2021-08-01 07:19:16

語言OpenrestyNginx

2021-10-26 10:40:26

代理模式虛擬

2021-12-04 22:05:02

Linux

2022-05-17 08:02:55

GoTryLock模式

2023-02-26 22:33:32

字符串排列算法

2021-07-06 08:59:18

抽象工廠模式

2021-05-11 08:54:59

建造者模式設計

2021-07-05 22:11:38

MySQL體系架構

2023-11-28 08:29:31

Rust內存布局

2023-01-03 08:31:54

Spring讀取器配置

2022-08-23 08:00:59

磁盤性能網絡

2021-07-02 09:45:29

MySQL InnoDB數據

2022-08-26 09:29:01

Kubernetes策略Master
點贊
收藏

51CTO技術棧公眾號

136fldh精品导航福利| 日韩欧美精品网站| 国产精品一区二区三区久久久 | 久久精品女人天堂| 精品一区二区三区电影| 亚洲五月天综合| av在线电影免费观看| 捆绑变态av一区二区三区| 欧美日韩成人精品| 熟女俱乐部一区二区| 国产成年精品| 狠狠躁夜夜躁人人爽超碰91| 伊人久久大香线蕉av一区| 蜜桃91麻豆精品一二三区| 水野朝阳av一区二区三区| 美女视频黄免费的亚洲男人天堂| 亚洲第一黄色网址| 99er精品视频| 日韩欧美一区二区在线| 成人免费看片视频在线观看| 亚洲人成色777777老人头| 久久99最新地址| 欧洲成人性视频| 久草中文在线视频| 国产传媒免费观看| 视频一区二区三区不卡| a级高清视频欧美日韩| 国产日韩欧美夫妻视频在线观看| 一区二区三区视频免费看| 久久精品青草| 在线播放国产精品| 中国极品少妇videossexhd| 综合欧美精品| 欧美性xxxxxxxx| 国模吧无码一区二区三区| 69xxx在线| 一区在线中文字幕| 亚洲高清资源综合久久精品| 天天干天天草天天射| 国产麻豆精品95视频| 国产欧美日韩精品在线观看| 中文字幕视频网站| 亚洲精选一区| 久久久噜噜噜久久中文字免| 卡通动漫亚洲综合| 97国产精品| 在线中文字幕亚洲| 一本色道a无线码一区v| 日本五级黄色片| 国产人成网在线播放va免费| 久久精品亚洲精品国产欧美| 精品国产乱码久久久久| 亚洲精品视频网| 国产很黄免费观看久久| 91亚洲精品久久久久久久久久久久| 青娱乐在线免费视频| 久久激情久久| 国产极品jizzhd欧美| 天堂中文在线网| 久久精品一区| 国产精品精品久久久| 日韩国产亚洲欧美| 免费高清在线一区| 国产乱人伦真实精品视频| 中文字幕乱码视频| 久99久精品视频免费观看| 成人动漫网站在线观看| 国产又粗又大又爽| 国产精品一区二区在线观看网站| 亚洲美女免费视频| 国产精品一区专区欧美日韩| 精品国产乱子伦| 日本不卡一二三区黄网| 国产剧情久久久久久| 91丨porny丨在线中文 | 国产精品美女在线| 波多野结衣绝顶大高潮| 久久国产乱子精品免费女| 91精品国产综合久久香蕉922| 一区二区www| 国产福利一区二区三区| 国产偷久久久精品专区| 青青草在线播放| 欧美国产精品v| 国产日韩视频在线播放| 国产盗摄在线视频网站| 激情成人在线视频| 青青草精品视频在线观看| 欧美极品在线| 亚洲成人999| 欧美一级大片在线观看| 五月天开心婷婷| 日韩在线网址| 日韩成人性视频| 欧美亚洲色综久久精品国产| 午夜久久福利| 国产精品高潮呻吟久久av无限| 国产精品怡红院| bt7086福利一区国产| 无码免费一区二区三区免费播放 | 极品尤物一区| 一区二区欧美亚洲| 久久久精品国产sm调教| 久热国产精品| 91久久极品少妇xxxxⅹ软件| 精品无人乱码| 亚洲乱码日产精品bd| 人妻少妇被粗大爽9797pw| 欧美一区=区三区| 欧美精品一区二区三区一线天视频| av男人的天堂av| 韩日成人在线| 国产男女猛烈无遮挡91| www.黄色网| 中文字幕一区二区人妻痴汉电车| 国内精品国产成人| 久久综合九色综合久99| 国产激情视频在线观看| 色综合欧美在线视频区| 日本少妇激三级做爰在线| 综合亚洲自拍| 欧美精品www| 国产片在线播放| 欧美高清在线视频| 精品中文字幕av| 盗摄牛牛av影视一区二区| 久久精品成人欧美大片古装| 无码一区二区三区| 成人av资源在线| 男人添女人下部视频免费| 日韩成人免费av| 一区二区在线视频播放| 国产精品suv一区二区三区| 国产精品小仙女| 亚洲日本无吗高清不卡| 成人av免费电影网站| 精品国产网站在线观看| av激情在线观看| 久久精品国产一区二区三区免费看| 国产精品成人免费在线| 精品无人区一区二区三区| 三级网站视频在在线播放| 欧美久久高跟鞋激| 男人舔女人下部高潮全视频| 国产精品日韩久久久| 国产 高清 精品 在线 a| www视频在线看| 91精品在线麻豆| 亚洲伦理一区二区三区| 久久99久久精品欧美| 日韩影院一区| 97成人超碰| 色先锋资源久久综合5566| 日韩黄色一级视频| 国产午夜久久久久| 福利在线一区二区三区| 日本不卡高清| 国产精品老女人视频| 国产高清自拍视频在线观看| 欧美视频在线一区| 日本伦理一区二区三区| 久久精品久久精品| 4444在线观看| 97色成人综合网站| 欧美激情一级欧美精品| 污污动漫在线观看| 欧美a级在线观看| 亚洲精品久久视频| 超碰超碰超碰超碰| 亚洲国产经典视频| 亚洲欧美天堂在线| 欧美午夜精品| 国内一区二区三区在线视频| 亚洲日本天堂| 中文字幕综合在线| 国产青青草视频| 亚洲一区中文日韩| 久久人人爽人人爽人人片| 肉丝袜脚交视频一区二区| 亚洲欧洲中文| 日韩精品中文字幕一区二区| 国内精品400部情侣激情| 欧美性孕妇孕交| 欧美日韩美女一区二区| 欧美精品xxxxx| 91免费小视频| 91小视频在线播放| 一区在线视频观看| 日韩欧美国产二区| 精品视频一二| 欧美最猛黑人xxxx黑人猛叫黄 | 色吧影院999| 日本三级免费网站| 可以免费观看的毛片| 五月激情综合婷婷| 亚洲色图欧美色| 国产成人精品免费一区二区| 日本精品久久久久中文字幕| 午夜影院欧美| 就去色蜜桃综合| 精品国模一区二区三区欧美| 热re99久久精品国产66热| 精品国产白色丝袜高跟鞋| 日韩成人在线观看| 一区二区精品视频在线观看| 天天影视涩香欲综合网| 三上悠亚作品在线观看| 99精品在线观看视频| 奇米视频888| 久久深夜福利| 欧美中文字幕在线观看视频 | 国产乱码一区二区三区| 欧美高清中文字幕| 三级电影一区| 欧美激情一区二区三区在线视频 | 欧美一区二区三区爽爽爽| 99久久免费国产| 欧美性感一类影片在线播放| 四虎成人免费影院| 成人性生交大片免费看中文网站| 日本人视频jizz页码69| 日韩图片一区| 国产 国语对白 露脸| 成人影院在线| 欧美日韩综合网| 国产精品毛片视频| 国产日韩av在线播放| 日韩天堂在线| 91精品国产色综合| 日本不卡影院| 久久五月天色综合| melody高清在线观看| 日韩国产在线看| 天堂中文在线看| 日韩精品中文字幕一区二区三区 | 日韩影院一区二区| 国产精品乱码一区二三区小蝌蚪| 免费看污片网站| 99久久综合狠狠综合久久| 91九色蝌蚪porny| 粉嫩一区二区三区在线看| 久久精品亚洲天堂| 久久成人久久爱| 亚洲综合色在线观看| 黄色网页在线免费看| 91视频国产观看| 久久久久久无码精品人妻一区二区| 美女国产一区二区三区| 99视频免费播放| 久久精品一区| www.超碰com| 日韩国产欧美在线观看| 日日摸天天爽天天爽视频| 麻豆成人在线| 91淫黄看大片| 久久国产生活片100| 国产亚洲视频一区| 国产精品自拍av| 国产一级二级av| 国产精品一区二区久久不卡| 香蕉视频1024| 成人av网站在线观看| 91九色蝌蚪porny| 97精品国产露脸对白| a级大片在线观看| 国产人成一区二区三区影院| 免费看日本黄色片| 亚洲欧洲国产日本综合| 久久国产精品国语对白| 亚洲激情图片qvod| 日本熟妇色xxxxx日本免费看| 午夜成人免费视频| 91在线视频免费播放| 欧美日韩美女一区二区| www.黄色一片| 精品视频偷偷看在线观看 | 少妇高潮 亚洲精品| 国产黄色在线网站| 欧美激情中文网| 国产精品伦理| 国产综合福利在线| 1204国产成人精品视频| 久久综合一区二区三区| 丁香影院在线| 国产精品婷婷午夜在线观看| 国产极品视频在线观看| 亚洲欧美偷拍另类a∨色屁股| 国产香蕉在线视频| 色香蕉久久蜜桃| 国产同性人妖ts口直男| 日韩av在线资源| 欧美性猛交xxx乱大交3蜜桃| 欧美国产日韩xxxxx| 周于希免费高清在线观看| 成人网在线免费观看| 国产乱人伦丫前精品视频| 亚洲精品tv久久久久久久久| 欧美日韩亚洲一区在线观看| 韩国一区二区av| 国产精品1区2区3区| 精品无码人妻一区| 亚洲免费观看高清完整版在线观看 | 欧美国产高跟鞋裸体秀xxxhd| 偷拍自拍在线看| 92裸体在线视频网站| 亚洲传媒在线| 中国一级黄色录像| 久久av在线| 91网址在线观看精品| 91免费观看视频| 欧美黄色一区二区三区| 欧美亚洲高清一区| 精品少妇人妻av一区二区| 性感美女一区二区在线观看| 91色琪琪电影亚洲精品久久| 青青一区二区| 毛片在线视频观看| 老司机精品久久| 性欧美18—19sex性高清| 国产精品国产自产拍高清av| 精品人妻一区二区三区潮喷在线 | 麻豆精品国产传媒| 中文字幕av一区二区三区免费看| 永久免费看片在线播放| 日韩一区二区三区观看| 成人高潮成人免费观看| 欧美与黑人午夜性猛交久久久| 成人在线超碰| 黄色网络在线观看| 日本在线观看不卡视频| 黄色工厂在线观看| 午夜国产精品一区| 黄色片一区二区三区| 欧美大片免费观看| 国产一区二区三区免费观看在线| 日韩欧美在线观看强乱免费| 男人天堂欧美日韩| 黄色av网址在线观看| 亚洲综合清纯丝袜自拍| 99国产精品一区二区三区| www.亚洲天堂| 九九九精品视频| 香蕉久久夜色| 成人开心激情| 亚洲欧美制服另类日韩| 久久免费电影| 成人黄色片视频网站| 午夜激情一区| 亚洲天堂网站在线| 日韩理论片中文av| 国产美女主播在线观看| 久久综合久中文字幕青草| 永久免费观看精品视频| 亚洲一卡二卡| 久久国产人妖系列| 91高清免费观看| 日韩亚洲欧美中文三级| 中文在线观看免费| 国产精品视频福利| 亚洲另类黄色| 加勒比一区二区| 欧美性淫爽ww久久久久无| 四虎久久免费| 亚洲一区中文字幕在线观看| 欧美日韩国产欧| 精品国产av色一区二区深夜久久 | 亚洲欧美在线观看| 97在线播放免费观看| 久久久黄色av| 波多野结衣一区二区三区免费视频| 一本久道高清无码视频| 91久色porny| 亚洲一区中文字幕永久在线| 久久国产精品久久久久| 成人精品毛片| 欧美牲交a欧美牲交aⅴ免费下载| 中文字幕欧美日韩一区| av噜噜色噜噜久久| 美女毛片一区二区三区四区| 免费看污污网站| 亚洲免费毛片网站| 天堂在线免费av| 国产精品青草久久久久福利99| 国产高清一区二区| 涩视频在线观看| 日韩欧美成人网| 黄视频网站在线| 国产精品久久久久久久天堂第1集| 国产视频亚洲| 亚洲精品天堂网| 亚洲国产精品va在线看黑人| 亚洲不卡系列| 成人免费a级片| 国产欧美日韩另类视频免费观看| 国产精品久久婷婷| 91精品国产色综合久久不卡98口| 欧美色婷婷久久99精品红桃| 人妻互换一二三区激情视频| 欧洲精品中文字幕| 自由的xxxx在线视频|