日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[剑指offer]面试题第[38]题[JAVA][字符串的排列][回溯法]

發(fā)布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [剑指offer]面试题第[38]题[JAVA][字符串的排列][回溯法] 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【問題描述】[中等]

輸入一個字符串,打印出該字符串中字符的所有排列。 你可以以任意順序返回這個字符串?dāng)?shù)組,但里面不能有重復(fù)元素。示例: 輸入:s = "abc" 輸出:["abc","acb","bac","bca","cab","cba"]限制: 1 <= s 的長度 <= 8

【解答思路】

回溯法


時間復(fù)雜度:O(N!) 空間復(fù)雜度:O(N^2)

class Solution {List<String> res = new LinkedList<>();char[] c;public String[] permutation(String s) {c = s.toCharArray();dfs(0);return res.toArray(new String[res.size()]);}void dfs(int x) {if(x == c.length - 1) {res.add(String.valueOf(c)); // 添加排列方案return;}HashSet<Character> set = new HashSet<>();for(int i = x; i < c.length; i++) {if(set.contains(c[i])) continue; // 重復(fù),因此剪枝set.add(c[i]);swap(i, x); // 交換,將 c[i] 固定在第 x 位 dfs(x + 1); // 開啟固定第 x + 1 位字符swap(i, x); // 恢復(fù)交換}}void swap(int a, int b) {char tmp = c[a];c[a] = c[b];c[b] = tmp;} }
2.

時間復(fù)雜度:O(N) 空間復(fù)雜度:O(1)

import java.util.ArrayList; import java.util.Arrays; import java.util.List;public class Solution {public String[] permutation(String s) {int len = s.length();if (len == 0) {return new String[0];}// 轉(zhuǎn)換成字符數(shù)組是常見的做法char[] charArr = s.toCharArray();// 排序是為了去重方便Arrays.sort(charArr);// 由于操作的都是字符,使用 StringBuilderStringBuilder path = new StringBuilder();boolean[] used = new boolean[len];// 為了方便收集結(jié)果,使用動態(tài)數(shù)組List<String> res = new ArrayList<>();dfs(charArr, len, 0, used, path, res);// 記得轉(zhuǎn)成字符串?dāng)?shù)組return res.toArray(new String[0]);}/*** @param charArr 字符數(shù)組* @param len 字符數(shù)組的長度* @param depth 當(dāng)前遞歸深度* @param used 當(dāng)前字符是否使用* @param path 從根結(jié)點到葉子結(jié)點的路徑* @param res 保存結(jié)果集的變量*/private void dfs(char[] charArr,int len,int depth,boolean[] used,StringBuilder path,List<String> res) {if (depth == len) {// path.toString() 恰好生成了新的字符對象res.add(path.toString());return;}for (int i = 0; i < len; i++) {if (!used[i]) {if (i > 0 && charArr[i] == charArr[i - 1] && !used[i - 1]) {continue;}used[i] = true;path.append(charArr[i]);dfs(charArr, len, depth + 1, used, path, res);// 遞歸完成以后,需要撤銷選擇,遞歸方法執(zhí)行之前做了什么,遞歸方法執(zhí)行以后就需要做相應(yīng)的逆向操作path.deleteCharAt(path.length() - 1);used[i] = false;}}}public static void main(String[] args) {Solution solution = new Solution();String[] res = solution.permutation("aba");System.out.println(Arrays.toString(res));} }

【總結(jié)】

1.回溯法 剪枝+恢復(fù)狀態(tài)
2.collection.toArray(new String[0])中new String[0]的語法解釋(指定泛型)

3. 寫法二會比寫法一 好理解

轉(zhuǎn)載鏈接: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/
參考鏈接:https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/solution/hui-su-suan-fa-java-by-liweiwei1419/

總結(jié)

以上是生活随笔為你收集整理的[剑指offer]面试题第[38]题[JAVA][字符串的排列][回溯法]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。